11 #include "CoinHelperFunctions.hpp"
12 #include "CglCutGenerator.hpp"
13 #include "OsiClpSolverInterface.hpp"
21 using namespace Ipopt;
22 using namespace Couenne;
24 #define THRESH_OBBT_AUX 50 // if more than this originals, don't do OBBT on auxs
26 #define MAX_OBBT_LP_ITERATION 100
27 #define MAX_OBBT_ATTEMPTS 1 // number of OBBT iterations at root node
32 #define THRES_NBD_CHANGED 1
35 #define MAX_OBBT_ITER 1
42 int CouenneProblem::call_iter (OsiSolverInterface *csi,
44 const CoinWarmStart *warmstart,
50 int ncols = csi -> getNumCols (),
53 for (
int ii=0; ii<ncols; ii++) {
55 if (CoinCpuTime () > maxCpuTime_)
58 int i = evalOrder (ii);
62 if ((Var (i) -> Type () == type) &&
63 (Var (i) -> Multiplicity () > 0) &&
65 (aSign == expression::AUX_EQ) ||
66 ((aSign == expression::AUX_LEQ) && (sense > 0)) ||
67 ((aSign == expression::AUX_GEQ) && (sense < 0)))) {
69 int ni = obbt_iter (csi, chg_bds, warmstart, babInfo, objcoe, sense, i);
87 if (ni < 0)
return ni;
98 int CouenneProblem::obbtInner (OsiSolverInterface *csi,
105 int ncols = csi -> getNumCols ();
106 const double *lb = csi -> getColLower (),
107 *ub = csi -> getColUpper ();
109 double inf = csi -> getInfinity ();
111 for (
int i=ncols; i--;) {
119 csi -> setObjSense (1);
121 csi -> applyCuts (cs);
122 csi -> initialSolve ();
124 const CoinWarmStart *warmstart = csi -> getWarmStart ();
128 double *objcoe = (
double *) malloc (ncols *
sizeof (
double));
131 for (
int i=ncols; i--;)
135 csi -> setObjective (objcoe);
136 csi -> setObjSense (1);
140 const int Infeasible = 1;
146 if ((ni = call_iter (csi, chg_bds, warmstart, babInfo, objcoe,
VAR, 1)) < 0)
throw Infeasible;
149 if ((ni = call_iter (csi, chg_bds, warmstart, babInfo, objcoe,
VAR, -1)) < 0)
throw Infeasible;
154 if ((ni = call_iter (csi, chg_bds, warmstart, babInfo, objcoe,
AUX, 1)) < 0)
throw Infeasible;
157 if ((ni = call_iter (csi, chg_bds, warmstart, babInfo, objcoe,
AUX, -1)) < 0)
throw Infeasible;
162 catch (
int exception) {
164 if (exception == Infeasible)
177 const OsiSolverInterface &si,
179 const CglTreeInfo &
info,
194 int nTotImproved = 0;
198 ((logObbtLev_ != 0) ||
199 (info.level == 0)) &&
201 ((logObbtLev_ < 0) ||
202 (info.level <= logObbtLev_) ||
204 (CoinDrand48 () < pow (2., (
double) logObbtLev_ - (info.level + 1))))) {
206 if ((info.level <= 0 && !(info.inTree)) ||
207 jnlst_ -> ProduceOutput (J_STRONGWARNING,
J_COUENNE)) {
209 jnlst_ -> Printf (J_ERROR,
J_COUENNE,
"Optimality Based BT: ");
220 OsiSolverInterface *csi = si.clone (
true);
222 csi -> messageHandler () -> setLogLevel (0);
225 OsiClpSolverInterface *clpcsi = dynamic_cast <OsiClpSolverInterface *> (csi);
228 clpcsi -> setupForRepeatedUse ();
233 int nImprov, nIter = 0;
235 bool notImproved =
false;
237 while (!notImproved &&
239 ((nImprov = obbtInner (csi, cs, chg_bds, babInfo)) > 0) &&
240 (CoinCpuTime () < maxCpuTime_)) {
242 int nchanged, *changed = NULL;
246 cg -> genColCuts (*csi, cs, nchanged, changed);
248 nTotImproved += nImprov;
254 int nCurCuts = cs.sizeRowCuts ();
255 cg -> genRowCuts (*csi, cs, nchanged, changed, chg_bds);
257 if (nCurCuts == cs.sizeRowCuts ())
260 }
else notImproved =
true;
270 if ((info.level <= 0 && !(info.inTree)) ||
271 jnlst_ -> ProduceOutput (J_STRONGWARNING,
J_COUENNE))
272 jnlst_ -> Printf (J_ERROR,
J_COUENNE,
"%d improved bounds\n", nTotImproved);
275 jnlst_->Printf(J_ITERSUMMARY,
J_BOUNDTIGHTENING,
" Couenne: infeasible node after OBBT\n");
Cut Generator for linear convexifications.
#define MAX_OBBT_LP_ITERATION
bool isWiped(OsiCuts &cs)
Check whether the previous cut generators have added an infeasible cut.
void fint fint fint real fint real real real real real real real real real fint real fint fint fint real fint fint fint fint * info
#define MAX_OBBT_ATTEMPTS
status of lower/upper bound of a variable, to be checked/modified in bound tightening ...
void sparse2dense(int ncols, t_chg_bounds *chg_bds, int *&changed, int &nchanged)
translate sparse to dense vector (should be replaced)
auxSign
"sign" of the constraint defining an auxiliary.
const Ipopt::EJournalCategory J_BOUNDTIGHTENING(Ipopt::J_USER2)
#define THRES_NBD_CHANGED
nodeType
type of a node in an expression tree
const Ipopt::EJournalCategory J_COUENNE(Ipopt::J_USER8)
Bonmin class for passing info between components of branch-and-cuts.