00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef COUENNE_CUT_GENERATOR_HPP
00012 #define COUENNE_CUT_GENERATOR_HPP
00013
00014
00015
00016 #include "BonOaDecBase.hpp"
00017 #include "CglConfig.h"
00018 #include "CglCutGenerator.hpp"
00019 #include "OsiRowCut.hpp"
00020 #include "BonAuxInfos.hpp"
00021 #include "BonBabInfos.hpp"
00022 #include "OsiSolverInterface.hpp"
00023 #include "CouenneConfig.h"
00024 #include "CouenneJournalist.hpp"
00025 #include "CouenneTypes.hpp"
00026
00027 namespace Ipopt {
00028 template <class T> class SmartPtr;
00029 class OptionsList;
00030 class Journalist;
00031 }
00032
00033 namespace Bonmin {
00034 class RegisteredOptions;
00035 class BabInfo;
00036 class OsiTMINLPInterface;
00037 class BabSetupBase;
00038 }
00039
00040 struct ASL;
00041
00042 namespace Couenne {
00043
00044 class CouenneProblem;
00045 class funtriplet;
00046
00048
00049 class CouenneCutGenerator: public CglCutGenerator {
00050
00051 protected:
00052
00055 mutable bool firstcall_;
00056
00059 mutable bool addviolated_;
00060
00062 enum conv_type convtype_;
00063
00065 int nSamples_;
00066
00068 CouenneProblem *problem_;
00069
00071 mutable int nrootcuts_;
00072
00074 mutable int ntotalcuts_;
00075
00077 mutable double septime_;
00078
00080 mutable double objValue_;
00081
00084 Bonmin::OsiTMINLPInterface *nlp_;
00085
00088 Bonmin::Bab *BabPtr_;
00089
00091 mutable bool infeasNode_;
00092
00094 JnlstPtr jnlst_;
00095
00097 mutable double rootTime_;
00098
00101 bool check_lp_;
00102
00105 bool enable_lp_implied_bounds_;
00106
00108 mutable int lastPrintLine;
00109
00110 public:
00111
00113 CouenneCutGenerator (Bonmin::OsiTMINLPInterface * = NULL,
00114 Bonmin::BabSetupBase *base = NULL,
00115 CouenneProblem * = NULL,
00116 struct ASL * = NULL);
00117
00119 CouenneCutGenerator (const CouenneCutGenerator &);
00120
00122 ~CouenneCutGenerator ();
00123
00125 CouenneCutGenerator *clone () const
00126 {return new CouenneCutGenerator (*this);}
00127
00129 inline CouenneProblem *Problem () const
00130 {return problem_;}
00131
00133 inline void setProblem (CouenneProblem *p)
00134 {problem_ = p;}
00135
00137 int getnvars () const;
00138
00140 inline bool isFirst () const
00141 {return firstcall_;}
00142
00144 inline bool addViolated () const
00145 {return addviolated_;}
00146
00148 inline enum conv_type ConvType () const
00149 {return convtype_;}
00150
00152 inline int nSamples () const
00153 {return nSamples_;}
00154
00156 void generateCuts (const OsiSolverInterface &,
00157 OsiCuts &,
00158 const CglTreeInfo = CglTreeInfo ())
00159 #if CGL_VERSION_MAJOR == 0 && CGL_VERSION_MINOR <= 57
00160 const
00161 #endif
00162 ;
00163
00165 int createCut (OsiCuts &,
00166 CouNumber,
00167 CouNumber,
00168
00169 int, CouNumber,
00170 int=-1, CouNumber=0.,
00171 int=-1, CouNumber=0.,
00172 bool = false) const;
00173
00175 int createCut (OsiCuts &,
00176 CouNumber,
00177 int,
00178
00179 int, CouNumber,
00180 int=-1, CouNumber=0.,
00181 int=-1, CouNumber=0.,
00182 bool = false) const;
00183
00187 void addEnvelope (OsiCuts &,
00188 int,
00189 unary_function, unary_function,
00190 int, int,
00191 CouNumber, CouNumber, CouNumber,
00192 t_chg_bounds * = NULL,
00193 bool = false) const;
00194
00198 void addEnvelope (OsiCuts &,
00199 int,
00200 funtriplet *,
00201 int, int,
00202 CouNumber, CouNumber, CouNumber,
00203 t_chg_bounds * = NULL,
00204 bool = false) const;
00205
00208 int addSegment (OsiCuts &, int, int,
00209 CouNumber, CouNumber,
00210 CouNumber, CouNumber, int) const;
00211
00213 int addTangent (OsiCuts &, int, int,
00214 CouNumber, CouNumber,
00215 CouNumber, int) const;
00216
00218 void setBabPtr (Bonmin::Bab *p)
00219 {BabPtr_ = p;}
00220
00222 void getStats (int &nrc, int &ntc, double &st) {
00223 nrc = nrootcuts_;
00224 ntc = ntotalcuts_;
00225 st = septime_;
00226 }
00227
00229 bool &infeasNode () const
00230 {return infeasNode_;}
00231
00233 void genRowCuts (const OsiSolverInterface &, OsiCuts &cs,
00234 int, int *, t_chg_bounds * = NULL) const;
00235
00237 void genColCuts (const OsiSolverInterface &, OsiCuts &, int, int *) const;
00238
00240 static void registerOptions (Ipopt::SmartPtr <Bonmin::RegisteredOptions> roptions);
00241
00243 void printLineInfo() const;
00244
00246 inline ConstJnlstPtr Jnlst() const
00247 {return ConstPtr (jnlst_);}
00248
00249 void setJnlst (JnlstPtr jnlst__)
00250 { jnlst_ = jnlst__; }
00251
00253 double &rootTime ()
00254 {return rootTime_;}
00255
00257 bool check_lp () const
00258 {return check_lp_;}
00259
00261 bool enableLpImpliedBounds () const
00262 {return enable_lp_implied_bounds_;}
00263 };
00264
00265
00267 void sparse2dense (int ncols, t_chg_bounds *chg_bds, int *&changed, int &nchanged);
00268
00269 }
00270
00271 #endif