00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef COUENNE_DISJUNCTIVE_CUTS_HPP
00012 #define COUENNE_DISJUNCTIVE_CUTS_HPP
00013
00014 #include "BonRegisteredOptions.hpp"
00015
00016 #include "OsiSolverInterface.hpp"
00017 #include "CglCutGenerator.hpp"
00018 #include "BonOsiTMINLPInterface.hpp"
00019 #include "BonBabSetupBase.hpp"
00020 #include "BonBabInfos.hpp"
00021 #include "OsiChooseVariable.hpp"
00022 #include "CouenneTypes.hpp"
00023 #include "CouenneJournalist.hpp"
00024
00025 class CouenneCutGenerator;
00026
00027 enum {COUENNE_INFEASIBLE, COUENNE_TIGHTENED, COUENNE_FEASIBLE};
00028
00030
00031 class CouenneDisjCuts: public CglCutGenerator {
00032
00033 protected:
00034
00036 CouenneCutGenerator *couenneCG_;
00037
00039 mutable int nrootcuts_;
00040
00042 mutable int ntotalcuts_;
00043
00045 mutable double septime_;
00046
00048 mutable double objValue_;
00049
00052 Bonmin::OsiTMINLPInterface *minlp_;
00053
00055 OsiChooseVariable *branchingMethod_;
00056
00058 bool isBranchingStrong_;
00059
00061 JnlstPtr jnlst_;
00062
00064 mutable int numDisjunctions_;
00065
00067 double initDisjPercentage_;
00068
00070 int initDisjNumber_;
00071
00073 int depthLevelling_;
00074
00076 int depthStopSeparate_;
00077
00079 bool activeRows_;
00080
00082 bool activeCols_;
00083
00085 bool addPreviousCut_;
00086
00088 double cpuTime_;
00089
00090 public:
00091
00093 CouenneDisjCuts (Bonmin::OsiTMINLPInterface *minlp = NULL,
00094 Bonmin::BabSetupBase *base = NULL,
00095 CouenneCutGenerator *cg = NULL,
00096 OsiChooseVariable *bcv = NULL,
00097 bool is_strong = false,
00098 JnlstPtr journalist = NULL,
00099 const Ipopt::SmartPtr<Ipopt::OptionsList> options = NULL);
00100
00102 CouenneDisjCuts (const CouenneDisjCuts &);
00103
00105 ~CouenneDisjCuts ();
00106
00108 CouenneDisjCuts *clone () const
00109 {return new CouenneDisjCuts (*this);}
00110
00112 inline CouenneCutGenerator *couenneCG () const
00113 {return couenneCG_;}
00114
00116 void generateCuts (const OsiSolverInterface &,
00117 OsiCuts &,
00118 const CglTreeInfo = CglTreeInfo ()) const;
00119
00121 static void registerOptions (Ipopt::SmartPtr <Bonmin::RegisteredOptions> roptions);
00122
00124 inline ConstJnlstPtr Jnlst() const
00125 {return ConstPtr (jnlst_);}
00126
00128 int getDisjunctions (std::vector <std::pair <OsiCuts *, OsiCuts *> > &disjunctions,
00129 OsiSolverInterface &si,
00130 OsiCuts &cs,
00131 const CglTreeInfo &info) const;
00132
00134 int separateWithDisjunction (OsiCuts *cuts,
00135 OsiSolverInterface &si,
00136 OsiCuts &cs,
00137 const CglTreeInfo &info) const;
00138
00140 int generateDisjCuts (std::vector <std::pair <OsiCuts *, OsiCuts *> > &disjs,
00141 OsiSolverInterface &si,
00142 OsiCuts &cs,
00143 const CglTreeInfo &info) const;
00144
00146 int checkDisjSide (OsiSolverInterface &si, OsiCuts *cuts) const;
00147
00149 int getBoxUnion (OsiSolverInterface &si,
00150 OsiCuts *left, OsiCuts *right,
00151 CoinPackedVector &lower, CoinPackedVector &upper) const;
00152
00153 protected:
00154
00156 OsiCuts *getSingleDisjunction (OsiSolverInterface &si) const;
00157
00159 void mergeBoxes (int dir,
00160 CoinPackedVector &left,
00161 CoinPackedVector &right,
00162 CoinPackedVector merged) const;
00163
00165 void applyColCuts (OsiSolverInterface &si,
00166 OsiCuts *cuts) const;
00167
00169 void applyColCuts (OsiSolverInterface &si,
00170 OsiColCut *cut) const;
00171
00172
00173 void OsiSI2MatrVec (CoinPackedMatrix &M,
00174 CoinPackedVector &r,
00175 OsiSolverInterface &si) const;
00176
00179 int OsiCuts2MatrVec (OsiSolverInterface *cglp,
00180 OsiCuts *cuts,
00181 int displRow,
00182 int displRhs) const;
00183 };
00184
00185
00187 inline void CoinInvN (register const double *orig,
00188 register int n,
00189 register double *inverted) {
00190
00191 while (n--) *inverted++ = - *orig++;
00192 }
00193
00194
00196 inline void CoinCopyDisp (register const int *src,
00197 register int num,
00198 register int *dst,
00199 register int displacement) {
00200 while (num--)
00201 *dst++ = *src++ + displacement;
00202 }
00203
00204 #endif