Bonmin
1.7
|
00001 // (C) Copyright International Business Machines Corporation 2007 00002 // All Rights Reserved. 00003 // This code is published under the Common Public License. 00004 // 00005 // Authors : 00006 // Pierre Bonami, International Business Machines Corporation 00007 // 00008 // Date : 10/16/2007 00009 #ifndef BonminTMINLP2OsiLP_H 00010 #define BonminTMINLP2OsiLP_H 00011 00012 #include <cmath> 00013 #include <cstdio> 00014 #include "IpSmartPtr.hpp" 00015 #include "IpTNLP.hpp" 00016 #include "BonTypes.hpp" 00017 00018 class OsiSolverInterface; 00019 class OsiCuts; 00020 00021 namespace Bonmin { 00022 class TMINLP2TNLP; 00023 class BabSetupBase; 00024 00026 class TMINLP2OsiLP: public Ipopt::ReferencedObject { 00027 00028 public: 00029 00031 TMINLP2OsiLP(): 00032 tiny_(-0.), 00033 very_tiny_(-0.) 00034 {} 00035 00037 TMINLP2OsiLP(const TMINLP2OsiLP & other): 00038 tiny_(other.tiny_), 00039 very_tiny_(other.very_tiny_), 00040 model_(other.model_){ 00041 } 00042 00044 virtual TMINLP2OsiLP * clone() const = 0; 00045 00046 void set_tols(double tiny, double very_tiny, double rhs_relax, double infty){ 00047 tiny_ = tiny; 00048 very_tiny_ = very_tiny; 00049 rhs_relax_ = rhs_relax; 00050 infty_ = infty; 00051 } 00052 00053 void set_model(Bonmin::TMINLP2TNLP * model){ 00054 model_ = model; 00055 initialize_jac_storage(); 00056 } 00057 00059 TMINLP2OsiLP & operator=(const TMINLP2OsiLP& rhs){ 00060 if(this != & rhs){ 00061 tiny_ = rhs.tiny_; 00062 very_tiny_ = rhs.very_tiny_; 00063 model_ = rhs.model_; 00064 } 00065 return (*this); 00066 } 00067 00069 ~TMINLP2OsiLP(){} 00070 00072 virtual void extract(OsiSolverInterface *si, 00073 const double * x, bool getObj) = 0; 00074 00075 00077 virtual void get_refined_oa(OsiCuts & cs 00078 ) const = 0; 00079 00081 virtual void get_oas(OsiCuts & cs, 00082 const double * x, bool getObj, bool global) const = 0; 00083 00084 00085 00086 protected: 00088 inline bool cleanNnz(double &value, double colLower, double colUpper, 00089 double rowLower, double rowUpper, double colsol, 00090 double & lb, double &ub, double tiny, double veryTiny) const; 00092 double tiny_; 00094 double very_tiny_; 00096 double rhs_relax_; 00098 double infty_; 00100 static int nTimesCalled; 00101 00104 mutable vector<int> jCol_; 00106 mutable vector<int> iRow_; 00108 mutable vector<double> value_; 00109 00110 vector<Ipopt::TNLP::LinearityType> const_types_; 00111 00112 void initialize_jac_storage(); 00113 00114 Ipopt::SmartPtr<Bonmin::TMINLP2TNLP> model_; 00115 }; 00116 00117 //A procedure to try to remove small coefficients in OA cuts (or make it non small 00118 inline 00119 bool 00120 TMINLP2OsiLP::cleanNnz(double &value, double colLower, double colUpper, 00121 double rowLower, double rowUpper, double colsol, 00122 double & lb, double &ub, double tiny, double veryTiny) const 00123 { 00124 if(fabs(value)>= tiny) return 1; 00125 //fprintf(stderr, "Warning: small coefficient %g\n", tiny); 00126 00127 if(fabs(value)<veryTiny) return 0;//Take the risk? 00128 00129 //try and remove 00130 double infty = 1e20; 00131 bool colUpBounded = colUpper < 10000; 00132 bool colLoBounded = colLower > -10000; 00133 bool rowNotLoBounded = rowLower <= - infty; 00134 bool rowNotUpBounded = rowUpper >= infty; 00135 bool pos = value > 0; 00136 00137 if(colLoBounded && !pos && rowNotUpBounded) { 00138 lb += value * (colsol - colLower); 00139 return 0; 00140 } 00141 else 00142 if(colLoBounded && pos && rowNotLoBounded) { 00143 ub += value * (colsol - colLower); 00144 return 0; 00145 } 00146 else 00147 if(colUpBounded && pos && rowNotUpBounded) { 00148 lb += value * (colsol - colUpper); 00149 return 0; 00150 } 00151 else 00152 if(colUpBounded && !pos && rowNotLoBounded) { 00153 ub += value * (colsol - colUpper); 00154 return 0; 00155 } 00156 //can not remove coefficient 00157 return 1; 00158 } 00159 00160 00161 } 00162 00163 #endif 00164