00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef COUENNEOBJECT_HPP
00013 #define COUENNEOBJECT_HPP
00014
00015 #include "BonBabSetupBase.hpp"
00016 #include "CoinFinite.hpp"
00017
00018 #include "exprVar.hpp"
00019 #include "CouenneJournalist.hpp"
00020 #include "OsiBranchingObject.hpp"
00021
00022 #define AGGR_MUL 2
00023 #define THRES_ZERO_SYMM 0.8
00024
00025 const CouNumber closeToBounds = .05;
00026
00031
00032 enum {TWO_LEFT, TWO_RIGHT, TWO_RAND,
00033 THREE_LEFT, THREE_CENTER, THREE_RIGHT, THREE_RAND, BRANCH_NONE};
00034
00035 class funtriplet;
00036 class CouenneProblem;
00037 class CouenneCutGenerator;
00038
00039 CouNumber minMaxDelta (funtriplet *ft, CouNumber lb, CouNumber ub);
00040 CouNumber maxHeight (funtriplet *ft, CouNumber lb, CouNumber ub);
00041
00042
00048
00049 class CouenneObject: public OsiObject {
00050
00051 public:
00052
00054 enum pseudocostMult {INFEASIBILITY,
00055 INTERVAL_LP, INTERVAL_LP_REV,
00056 INTERVAL_BR, INTERVAL_BR_REV,
00057 PROJECTDIST};
00058
00060 enum branch_obj {EXPR_OBJ, VAR_OBJ, VT_OBJ};
00061
00063 enum brSelStrat {NO_STRATEGY, NO_BRANCH, MID_INTERVAL, MIN_AREA, BALANCED, LP_CENTRAL, LP_CLAMPED};
00064
00066 CouenneObject ();
00067
00069 CouenneObject (CouenneCutGenerator *cutgen,
00070 CouenneProblem *p,
00071 exprVar *ref, Bonmin::BabSetupBase *base, JnlstPtr jnlst);
00072
00074 CouenneObject (exprVar *ref, Bonmin::BabSetupBase *base, JnlstPtr jnlst);
00075
00077 ~CouenneObject () {}
00078
00080 CouenneObject (const CouenneObject &src);
00081
00083 virtual CouenneObject * clone () const
00084 {return new CouenneObject (*this);}
00085
00087 void setParameters (Bonmin::BabSetupBase *base);
00088
00091 virtual double infeasibility (const OsiBranchingInformation *info, int &way) const;
00092
00095 virtual double checkInfeasibility (const OsiBranchingInformation * info) const;
00096
00098 virtual double feasibleRegion (OsiSolverInterface*, const OsiBranchingInformation*) const;
00099
00102 virtual OsiBranchingObject *createBranch (OsiSolverInterface*,
00103 const OsiBranchingInformation*, int) const;
00104
00106 exprVar *Reference () const
00107 {return reference_;}
00108
00110 enum brSelStrat Strategy () const
00111 {return strategy_;}
00112
00114 CouNumber getBrPoint (funtriplet *ft, CouNumber x0, CouNumber l, CouNumber u) const;
00115
00118 CouNumber midInterval (CouNumber x, CouNumber l, CouNumber u) const;
00119
00121 virtual double downEstimate () const
00122 {
00123
00124
00125
00126
00127 return downEstimate_;}
00128
00130 virtual double upEstimate () const
00131 {
00132
00133
00134
00135
00136 return upEstimate_;}
00137
00142 void setEstimate (double est, int direction)
00143 {(direction ? upEstimate_ : downEstimate_) = est;}
00144
00146 void setEstimates (const OsiBranchingInformation *info,
00147 CouNumber *infeasibility,
00148 CouNumber *brpt) const;
00149
00151 virtual bool isCuttable () const {
00152 return (reference_ -> Image ()) ?
00153 ((!(reference_ -> isInteger ())) &&
00154 reference_ -> Image () -> isCuttable (problem_, reference_ -> Index ())) :
00155 (!(reference_ -> isInteger ()));
00156 }
00157
00159 virtual double intInfeasibility (double value) const
00160 {return CoinMin (value - floor (value + COUENNE_EPS), ceil (value - COUENNE_EPS) - value);}
00161
00162 protected:
00163
00165 CouenneCutGenerator *cutGen_;
00166
00168 CouenneProblem *problem_;
00169
00173 exprVar *reference_;
00174
00176 enum brSelStrat strategy_;
00177
00179 JnlstPtr jnlst_;
00180
00183 CouNumber alpha_;
00184
00186 CouNumber lp_clamp_;
00187
00189 CouNumber feas_tolerance_;
00190
00192 bool doFBBT_;
00193
00195 bool doConvCuts_;
00196
00198 mutable double downEstimate_;
00199
00201 mutable double upEstimate_;
00202
00204 enum pseudocostMult pseudoMultType_;
00205 };
00206
00207 #endif