00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "CglCutGenerator.hpp"
00012 #include "CouenneTypes.hpp"
00013 #include "CouenneProblem.hpp"
00014 #include "BonAuxInfos.hpp"
00015
00016
00017
00019 void updateBranchInfo (const OsiSolverInterface &si, CouenneProblem *p,
00020 t_chg_bounds *chg_bds, const CglTreeInfo &info) {
00021
00022 int ncols = p -> nVars ();
00023
00024 if ((info.inTree) && (info.pass==0)) {
00025
00026
00027
00028
00029
00030 OsiBabSolver *auxinfo = dynamic_cast <OsiBabSolver *> (si.getAuxiliaryInfo ());
00031
00032 bool
00033 have_parent_lower = false,
00034 have_parent_upper = false;
00035
00036 if (auxinfo && (auxinfo -> extraCharacteristics () & 2)) {
00037
00038
00039 const double * beforeLower = auxinfo -> beforeLower ();
00040 const double * beforeUpper = auxinfo -> beforeUpper ();
00041
00042 if (beforeLower || beforeUpper) {
00043
00044
00045 const double * nowLower = si.getColLower ();
00046 const double * nowUpper = si.getColUpper ();
00047
00048 if (beforeLower) {
00049
00050 have_parent_lower = true;
00051 for (int i=0; i < ncols; i++)
00052 if (nowLower [i] >= beforeLower [i] + COUENNE_EPS)
00053 chg_bds [i].setLower (t_chg_bounds::CHANGED);
00054 }
00055
00056 if (beforeUpper) {
00057
00058 have_parent_upper = true;
00059 for (int i=0; i < ncols; i++)
00060 if (nowUpper [i] <= beforeUpper [i] - COUENNE_EPS)
00061 chg_bds [i].setUpper (t_chg_bounds::CHANGED);
00062 }
00063 }
00064 }
00065
00066
00067
00068 if (!have_parent_lower ||
00069 !have_parent_upper) {
00070
00071 #ifdef DEBUG
00072 printf ("### Warning: could not access parent node's %sbounds in generateCuts()\n",
00073 have_parent_lower ? "upper " : have_parent_upper ? "lower " : "");
00074 #endif
00075
00076
00077 if (!have_parent_lower)
00078 for (int i=0; i < ncols; i++)
00079 chg_bds [i].setLower (t_chg_bounds::CHANGED);
00080
00081 if (!have_parent_upper)
00082 for (int i=0; i < ncols; i++)
00083 chg_bds [i].setUpper (t_chg_bounds::CHANGED);
00084 }
00085 }
00086
00087
00088 }