Bonmin  1.7
BonQuadCut.hpp
Go to the documentation of this file.
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