11 #include "CglCutGenerator.hpp"
16 using namespace Ipopt;
17 using namespace Couenne;
36 for (
int i=nVars(); i--; knownOptimum++)
38 if (*knownOptimum < Lb (i) ||
39 *knownOptimum > Ub (i)) {
46 knownOptimum -= nVars ();
53 Jnlst()->Printf(J_DETAILED,
J_BOUNDTIGHTENING,
" forward =====================\n ");
55 for (
int i=0; i < nVars (); i++)
56 if (variables_ [i] -> Multiplicity () > 0) {
58 "x_%03d [%+10g %+10g] ", i,
66 for (
int ii = 0,
j = nVars ();
j--; ii++) {
68 int i = numbering_ [ii];
72 if (var -> Multiplicity () <= 0)
80 if ((fabs (upper_i) < COIN_DBL_MAX / 10) &&
81 (fabs (lower_i) < COIN_DBL_MAX / 10) &&
82 (lower_i > upper_i +
COUENNE_BOUND_PREC * (1 + CoinMin (fabs (lower_i), fabs (upper_i))))) {
89 "pre-check: w_%d has infeasible bounds [%.10e,%.10e]. ", i, lower_i, upper_i);
93 var -> Lb () -> print (std::cout);
95 var -> Ub () -> print (std::cout);
110 if (var -> Type () !=
AUX)
120 var -> Image () -> getBounds (ll, uu);
123 if (var -> sign () != expression::AUX_LEQ) ll = ceil (ll -
COUENNE_EPS);
124 if (var -> sign () != expression::AUX_GEQ) uu = floor (uu +
COUENNE_EPS);
127 if (var -> sign () == expression::AUX_LEQ) ll = (*(var -> Lb ())) ();
128 else if (var -> sign () == expression::AUX_GEQ) uu = (*(var -> Ub ())) ();
135 "w_%d has infeasible bounds [%g,%g]: ", i, ll, uu);
138 var -> Lb () -> print (std::cout);
140 var -> Ub () -> print (std::cout);
167 " prop L %2d [%g,(%g)] -> [%g,(%g)] (%g) ",
168 i, lower_i, upper_i, ll, uu, lower_i - ll);
169 var -> print (std::cout);
173 var -> Image () -> print (std::cout);
179 ((knownOptimum [i] - lower_i) / (1 + std::max (fabs (knownOptimum [i]), fabs (lower_i))) >=
COUENNE_EPS) &&
180 ((knownOptimum [i] - ll) / (1 + std::max (fabs (knownOptimum [i]), fabs (ll))) <= -
COUENNE_EPS)) {
183 "Couenne: propagating l_%d cuts optimum: [%g --> %g -X-> %g] :: ",
184 i, lower_i, knownOptimum [i], ll);
185 var -> Lb () -> print (std::cout);
187 var -> Ub () -> print (std::cout);
196 "just-check: w_%d has infeasible bounds [%g,%g]. ", i, lower_i, upper_i);
200 chg_bds [i].
setLower (t_chg_bounds::CHANGED);
220 " prop U %2d [(%g),%g] -> [(%g),%g] (%g) ",
221 i, lower_i, upper_i, ll, uu, upper_i - uu);
222 var -> print (std::cout);
226 var -> Image () -> print (std::cout);
232 ((knownOptimum [i] - upper_i) / (1 + std::max (fabs (knownOptimum [i]), fabs (upper_i))) <= -
COUENNE_EPS) &&
233 ((knownOptimum [i] - uu) / (1 + std::max (fabs (knownOptimum [i]), fabs (uu))) >=
COUENNE_EPS)) {
236 "Couenne: propagating u_%d cuts optimum: [%g <-X- %g <-- %g] :: ",
237 i, uu, knownOptimum [i], upper_i);
238 var -> Lb () -> print (std::cout);
240 var -> Ub () -> print (std::cout);
249 "just-check: w_%d has infeasible bounds [%g,%g]. ", i, lower_i, upper_i);
253 chg_bds [i].
setUpper(t_chg_bounds::CHANGED);
263 " forward tightening %d changes\n", nchg);
status of lower/upper bound of a variable, to be checked/modified in bound tightening ...
void setLower(ChangeStatus lower)
#define COUENNE_BOUND_PREC
void setUpper(ChangeStatus upper)
const Ipopt::EJournalCategory J_BOUNDTIGHTENING(Ipopt::J_USER2)
double CouNumber
main number type in Couenne
bool isInteger(CouNumber x)
is this number integer?