CouenneDisjCuts.hpp

Go to the documentation of this file.
00001 /* $Id: CouenneDisjCuts.hpp 245 2009-07-22 15:47:08Z pbelotti $ */
00002 /*
00003  * Name:    CouenneDisjCuts.hpp
00004  * Author:  Pietro Belotti
00005  * Purpose: a generator of disjunctive cuts for MINLP problems
00006  *
00007  * (C) Carnegie-Mellon University, 2008. 
00008  * This file is licensed under the Common Public License (CPL)
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,                        // direction (negative for "<", positive for ">")
00160                    CoinPackedVector &left,         // input
00161                    CoinPackedVector &right,        // input
00162                    CoinPackedVector merged) const; // output  
00163 
00165   void applyColCuts (OsiSolverInterface &si,
00166                      OsiCuts *cuts) const;
00167 
00169   void applyColCuts (OsiSolverInterface &si, 
00170                      OsiColCut *cut) const;
00171 
00172   // construct reduced, standard form matrix M from coefficient matrix of si
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

Generated on Sun Mar 6 03:03:41 2011 for Couenne by  doxygen 1.4.7