@@ -82,33 +82,56 @@ def relaxed_ph_fixing(self, relaxed_solution, pre_iter0 = False):
82
82
relaxed_val = relaxed_solution [ci ]
83
83
xvar_value = xvar ._value
84
84
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 :
87
88
xvar .unfix ()
88
89
update_var = True
89
90
raw_fixed_this_iter -= 1
90
91
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 = } " )
92
93
# in case somebody else unfixs a variable in another rank...
93
- xb = s ._mpisppy_model .xbars [ndn_i ]._value
94
94
if abs (xb - xvar_value ) > self .bound_tol :
95
95
xvar .unfix ()
96
96
update_var = True
97
97
raw_fixed_this_iter -= 1
98
98
if self .debug and self .opt .cylinder_rank == 0 :
99
99
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
112
135
113
136
if update_var and persistent_solver :
114
137
sub ._solver_plugin .update_var (xvar )
0 commit comments