/home/coin/SVN-release/OS-2.1.0/Couenne/src/branch/CouenneObject.hpp

Go to the documentation of this file.
00001 /* $Id: CouenneObject.hpp 259 2009-10-04 14:20:13Z pbelotti $
00002  *
00003  * Name:    CouenneObject.hpp
00004  * Authors: Pierre Bonami, IBM Corp.
00005  *          Pietro Belotti, Carnegie Mellon University
00006  * Purpose: Object for auxiliary variables
00007  *
00008  * (C) Carnegie-Mellon University, 2006-09.
00009  * This file is licensed under the Common Public License (CPL)
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   {//if (jnlst_ -> ProduceOutput (J_MATRIX, J_BRANCHING)) {
00123     //printf ("DOWN EST = %g for ", downEstimate_); 
00124     //reference_ -> print (); 
00125     //printf ("\n");
00126     //}
00127   return downEstimate_;}
00128 
00130   virtual double upEstimate () const
00131   {//if (jnlst_ -> ProduceOutput (J_MATRIX, J_BRANCHING)) {
00132     //printf ("UP EST = %g for ", upEstimate_); 
00133     //reference_ -> print (); 
00134     //printf ("\n");
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

Generated on Tue Mar 30 03:04:36 2010 by  doxygen 1.4.7