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/06/2007 00009 00010 #ifndef BonQuadCut_H 00011 #define BonQuadCut_H 00012 00013 #include "CoinPackedMatrix.hpp" 00014 #include "OsiRowCut.hpp" 00015 #include "OsiCuts.hpp" 00016 #include "BonTypes.hpp" 00017 #include <list> 00018 00019 00020 namespace Bonmin { 00021 00022 enum MatrixStorageType { 00023 Upper , 00024 Lower , 00025 Full }; 00026 00027 class QuadCut : public OsiRowCut { 00028 public: 00029 00031 QuadCut(); 00032 00034 QuadCut(const QuadCut & other); 00035 00037 QuadCut& operator=(const QuadCut & rhs); 00038 00040 virtual OsiRowCut * clone() const; 00041 00043 ~QuadCut(); 00044 00046 void print() const; 00047 00049 CoinPackedMatrix& Q(){ 00050 return Q_; 00051 } 00052 00054 const CoinPackedMatrix& Q() const{ 00055 return Q_; 00056 } 00057 00060 MatrixStorageType& type(){ 00061 return type_;} 00062 00063 const MatrixStorageType& type() const{ 00064 return type_;} 00065 00067 double & c(){return c_;} 00068 00070 const double & c() const {return c_;} 00071 00073 double violated(const double * solution) const; 00074 00075 private: 00077 double c_; 00079 CoinPackedMatrix Q_; 00081 MatrixStorageType type_; 00082 00085 00086 void operator+=(double value); 00087 00089 void operator-=(double value); 00090 00092 void operator*=(double value); 00093 00095 void operator/=(double value); 00097 00098 }; 00099 00101 class Cuts : public OsiCuts { 00102 public: 00103 typedef vector<QuadCut *> QuadCutPtrStorage; 00105 Cuts(); 00106 00108 Cuts(const Cuts& other); 00109 00111 Cuts& operator=(const Cuts & rhs); 00112 00114 ~Cuts(); 00115 00117 inline void insert(const QuadCut& c); 00118 00123 inline void insert(QuadCut* &c); 00124 00126 inline void insert(const Cuts &cs); 00127 00129 inline int sizeQuadCuts() const; 00130 00132 inline int sizeCuts() const; 00133 00135 void printCuts() const; 00136 00137 00139 inline QuadCut * quadCutPtr(int i); 00140 00142 inline const QuadCut * quadCutPtr(int i) const; 00143 00145 inline QuadCut& quadCut(int i); 00146 00147 00149 inline const QuadCut& quadCut(int i) const; 00150 00152 inline void eraseQuadCut(int i); 00153 00154 private: 00155 QuadCutPtrStorage quadCuts_; 00156 }; 00157 00158 void 00159 Cuts::insert(const QuadCut &c){ 00160 quadCuts_.push_back(new QuadCut(c)); 00161 } 00162 00163 void 00164 Cuts::insert(QuadCut * &c){ 00165 quadCuts_.push_back(c); 00166 c = NULL; 00167 } 00168 00169 void 00170 Cuts::insert(const Cuts & cs){ 00171 OsiCuts::insert(cs); 00172 for(unsigned int i = 0 ; i < cs.quadCuts_.size() ; i++){ 00173 quadCuts_.push_back(new QuadCut(*cs.quadCuts_[i])); 00174 } 00175 } 00176 00177 int 00178 Cuts::sizeQuadCuts() const { 00179 return static_cast<int>(quadCuts_.size()); 00180 } 00181 00182 int 00183 Cuts::sizeCuts() const { 00184 return static_cast<int>(quadCuts_.size()) + OsiCuts::sizeCuts(); 00185 } 00186 00187 QuadCut * 00188 Cuts::quadCutPtr(int i) { 00189 return quadCuts_[i]; 00190 } 00191 00192 const QuadCut * 00193 Cuts::quadCutPtr(int i) const { 00194 return quadCuts_[i]; 00195 } 00196 00197 QuadCut & 00198 Cuts::quadCut(int i) { 00199 return *quadCuts_[i]; 00200 } 00201 00202 const QuadCut & 00203 Cuts::quadCut(int i) const { 00204 return *quadCuts_[i]; 00205 } 00206 00207 void 00208 Cuts::eraseQuadCut(int i){ 00209 delete quadCuts_[i]; 00210 quadCuts_.erase(quadCuts_.begin() + i); 00211 } 00212 typedef std::list<QuadCut*> list_QuadCut; 00213 00214 }// Ends Bonmin namespace 00215 #endif 00216 00217