Skip to content

Commit 4af18ff

Browse files
authored
Merge pull request #555 from bknueven/fix_relaxed_fixer
PH Relaxed Fixer: do not fix if not converged
2 parents 6ce5868 + e7b7a31 commit 4af18ff

File tree

1 file changed

+39
-16
lines changed

1 file changed

+39
-16
lines changed

mpisppy/extensions/relaxed_ph_fixer.py

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -82,33 +82,56 @@ def relaxed_ph_fixing(self, relaxed_solution, pre_iter0 = False):
8282
relaxed_val = relaxed_solution[ci]
8383
xvar_value = xvar._value
8484
update_var = False
85-
if not pre_iter0 and xvar.fixed:
86-
if (relaxed_val - xvar.lb) > self.bound_tol and (xvar.ub - relaxed_val) > self.bound_tol:
85+
xb = s._mpisppy_model.xbars[ndn_i]._value
86+
if xvar.fixed:
87+
if abs(relaxed_val - xvar_value) > self.bound_tol:
8788
xvar.unfix()
8889
update_var = True
8990
raw_fixed_this_iter -= 1
9091
if self.debug and self.opt.cylinder_rank == 0:
91-
print(f"{k}: unfixing var {xvar.name}; {relaxed_val=} is off bounds {(xvar.lb, xvar.ub)}")
92+
print(f"{k}: unfixing var {xvar.name}; {relaxed_val=} is different from {xvar_value=}")
9293
# in case somebody else unfixs a variable in another rank...
93-
xb = s._mpisppy_model.xbars[ndn_i]._value
9494
if abs(xb - xvar_value) > self.bound_tol:
9595
xvar.unfix()
9696
update_var = True
9797
raw_fixed_this_iter -= 1
9898
if self.debug and self.opt.cylinder_rank == 0:
9999
print(f"{k}: unfixing var {xvar.name}; xbar {xb} differs from the fixed value {xvar_value}")
100-
elif (relaxed_val - xvar.lb <= self.bound_tol) and (pre_iter0 or (xvar_value - xvar.lb <= self.bound_tol)):
101-
xvar.fix(xvar.lb)
102-
if self.debug and self.opt.cylinder_rank == 0:
103-
print(f"{k}: fixing var {xvar.name} to lb {xvar.lb}; {relaxed_val=}, var value is {xvar_value}")
104-
update_var = True
105-
raw_fixed_this_iter += 1
106-
elif (xvar.ub - relaxed_val <= self.bound_tol) and (pre_iter0 or (xvar.ub - xvar_value <= self.bound_tol)):
107-
xvar.fix(xvar.ub)
108-
if self.debug and self.opt.cylinder_rank == 0:
109-
print(f"{k}: fixing var {xvar.name} to ub {xvar.ub}; {relaxed_val=}, var value is {xvar_value}")
110-
update_var = True
111-
raw_fixed_this_iter += 1
100+
elif pre_iter0:
101+
if (relaxed_val - xvar.lb) <= self.bound_tol:
102+
xvar.fix(xvar.lb)
103+
if self.debug and self.opt.cylinder_rank == 0:
104+
print(f"{k}: fixing var {xvar.name} to lb {xvar.lb}; {relaxed_val=}")
105+
update_var = True
106+
raw_fixed_this_iter += 1
107+
if (xvar.ub - relaxed_val) <= self.bound_tol:
108+
xvar.fix(xvar.ub)
109+
if self.debug and self.opt.cylinder_rank == 0:
110+
print(f"{k}: fixing var {xvar.name} to ub {xvar.ub}; {relaxed_val=}")
111+
update_var = True
112+
raw_fixed_this_iter += 1
113+
# xbar, xhat, and relaxed_xhat all agree
114+
elif (abs(xb - xvar_value) <= self.bound_tol) and (abs(relaxed_val - xvar_value) <= self.bound_tol):
115+
if ( xvar_value - xvar.lb <= self.bound_tol ):
116+
xvar.fix(xvar.lb)
117+
if self.debug and self.opt.cylinder_rank == 0:
118+
print(f"{k}: fixing var {xvar.name} to lb {xvar.lb}; {relaxed_val=}, var value is {xvar_value}")
119+
update_var = True
120+
raw_fixed_this_iter += 1
121+
elif ( xvar.ub - xvar_value <= self.bound_tol ):
122+
xvar.fix(xvar.ub)
123+
if self.debug and self.opt.cylinder_rank == 0:
124+
print(f"{k}: fixing var {xvar.name} to ub {xvar.ub}; {relaxed_val=}, var value is {xvar_value}")
125+
update_var = True
126+
raw_fixed_this_iter += 1
127+
else:
128+
# # TODO: should we fix in this case? To xbar? What about integers? Maybe option-drive??
129+
# xvar.fix(xb)
130+
# if self.debug and self.opt.cylinder_rank == 0:
131+
# print(f"{k}: fixing var {xvar.name} to xbar {xb}; {relaxed_val=}, var value is {xvar_value}")
132+
# update_var = True
133+
# raw_fixed_this_iter += 1
134+
pass
112135

113136
if update_var and persistent_solver:
114137
sub._solver_plugin.update_var(xvar)

0 commit comments

Comments
 (0)