1 /* $Id$ */ 2 // (C) Copyright International Business Machines Corporation 2007 3 // All Rights Reserved. 4 // This code is published under the Eclipse Public License (EPL). 5 // 6 // Authors : 7 // Pierre Bonami, International Business Machines Corporation 8 // 9 // Date : 04/18/2007 10 11 #ifndef BonCouenneSetup_H 12 #define BonCouenneSetup_H 13 14 #include "BonBabSetupBase.hpp" 15 #include "BonBonminSetup.hpp" 16 #include "CbcFeasibilityBase.hpp" 17 18 #include "CouenneTNLP.hpp" 19 20 struct ASL; 21 22 namespace Bonmin{ 23 class Bab; 24 } 25 26 namespace Couenne { 27 28 class CouenneInterface; 29 class CouenneCutGenerator; 30 class CouenneProblem; 31 class CouenneTNLP; 32 33 class SmartAsl : public Ipopt::ReferencedObject{ 34 public: 35 ASL * asl; SmartAsl()36 SmartAsl(): 37 Ipopt::ReferencedObject(), 38 asl(NULL) 39 {} 40 virtual ~SmartAsl(); 41 }; 42 43 class CouenneSetup : public Bonmin::BonminSetup{ 44 public: 45 /** Default constructor*/ CouenneSetup()46 CouenneSetup(): 47 BonminSetup(), 48 aslfg_(NULL), 49 CouennePtr_ (NULL), 50 displayStats_ (false), 51 couenneProb_ (NULL), 52 couenneProb_is_own_(true) {} 53 54 /** Copy constructor.*/ CouenneSetup(const CouenneSetup & other)55 CouenneSetup(const CouenneSetup& other): 56 BonminSetup(other), 57 aslfg_(NULL), 58 displayStats_ (other.displayStats_), 59 couenneProb_ (other.couenneProb_) {} 60 61 /** virtual copy constructor.*/ clone() const62 virtual Bonmin::BabSetupBase * clone () const 63 {return new CouenneSetup (*this);} 64 65 /// destructor 66 virtual ~CouenneSetup(); 67 68 /** Initialize from command line arguments. */ 69 bool InitializeCouenne(char ** argv = NULL, 70 CouenneProblem *couenneProb = NULL, 71 Ipopt::SmartPtr<Bonmin::TMINLP> tminlp = NULL, 72 CouenneInterface *ci = NULL, 73 Bonmin::Bab *bb = NULL); 74 75 /** register the options */ 76 virtual void registerOptions(); 77 /** Register all Couenne options.*/ 78 static void registerAllOptions(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions); 79 80 /** Get the basic options if don't already have them.*/ readOptionsFile()81 virtual void readOptionsFile(){ 82 if (readOptions_) return; 83 Bonmin::BabSetupBase::readOptionsFile ("couenne.opt"); 84 } 85 86 /// return pointer to cut generator (used to get pointer to problem) couennePtr() const87 CouenneCutGenerator *couennePtr () const 88 {return CouennePtr_;} 89 90 /// true if one wants to display statistics at the end of program displayStats()91 bool displayStats () 92 {return displayStats_;} 93 94 /// add cut generators 95 void addMilpCutGenerators (); 96 97 /// modify parameter (used for MaxTime) setDoubleParameter(const DoubleParameter & p,const double val)98 inline void setDoubleParameter (const DoubleParameter &p, const double val) 99 {doubleParam_ [p] = val;} 100 101 /// modify parameter (used for MaxTime) getDoubleParameter(const DoubleParameter & p) const102 inline double getDoubleParameter (const DoubleParameter &p) const 103 {return doubleParam_ [p];} 104 setNodeComparisonMethod(Bonmin::BabSetupBase::NodeComparison c)105 void setNodeComparisonMethod (Bonmin::BabSetupBase::NodeComparison c) 106 {nodeComparisonMethod_ = c;} 107 108 private: 109 Ipopt::SmartPtr<SmartAsl> aslfg_; 110 111 /// hold a reference to Couenne cut generator to delete it at 112 /// last. The alternative would be to clone it every time the 113 /// CouenneSolverInterface is cloned (that is, at each call of 114 /// Optimality-based bound tightening). 115 CouenneCutGenerator *CouennePtr_; 116 117 /// true if one wants to display statistics at the end of program 118 bool displayStats_; 119 120 /// MINLP formulation 121 CouenneProblem *couenneProb_; 122 123 /// whether the couenneProb_ has been created by Couenne, and thus will be deleted by Couenne 124 bool couenneProb_is_own_; 125 }; 126 } 127 128 #endif 129