For activeSet, sqp, and sqpLegacy:
Any x0 value that is less than the lower bound for that entry, is replaced with the lower bound for that entry.
Any x0 value that is greater than the lower bound for that entry, is replaced with the upper bound for that entry.
The calculation is effectively
min( max(x0, lower_bounds), upper_bounds )
though not implemented that way.
For Trust Region Reflective, the helper routine startx() is called, which attempts to place the point in the center of the section... but it has to figure out what a sensible "center" in the case where bounds are finite. Some funky things are done with comparing abs() of the finite bounds to 1, and I do not follow those at the moment. The x0 is replaced by the finite bound adjusted by 1/2 of the absolute value of the finite bound but always at least 1/2 in the case where the bound was near 0; the point is adjusted on the infinite side of the finite bound. If both bounds are infinite, 1 is used.
In the case of Interior Point, shiftInitPtToInterior() is called. Unfortunately that is a .p so I cannot see how it calculates the new points.