/home/coin/SVN-release/CoinAll-1.1.0/Osi/src/OsiColCut.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2000, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 #ifndef OsiColCut_H
00004 #define OsiColCut_H
00005 
00006 #include <string>
00007 
00008 #include "CoinPackedVector.hpp"
00009 
00010 #include "OsiCollections.hpp"
00011 #include "OsiCut.hpp"
00012 
00021 class OsiColCut : public OsiCut {
00022    friend void OsiColCutUnitTest(const OsiSolverInterface * baseSiP, 
00023                                  const std::string & mpsDir);
00024   
00025 public:
00026   
00027   //----------------------------------------------------------------
00028   
00031 
00032   inline void setLbs( 
00033     int nElements, 
00034     const int * colIndices, 
00035     const double * lbElements );   
00036   
00038   inline void setLbs( const CoinPackedVector & lbs );
00039   
00041   inline void setUbs( 
00042     int nElements, 
00043     const int * colIndices, 
00044     const double * ubElements );
00045   
00047   inline void setUbs( const CoinPackedVector & ubs );
00049   
00050   //----------------------------------------------------------------
00051   
00054 
00055   inline const CoinPackedVector & lbs() const;
00057   inline const CoinPackedVector & ubs() const;
00059   
00062 #if __GNUC__ != 2 
00063   using OsiCut::operator== ;
00064 #endif
00065 
00068   inline virtual bool operator==(const OsiColCut& rhs) const; 
00069 
00070 #if __GNUC__ != 2 
00071   using OsiCut::operator!= ;
00072 #endif
00074   inline virtual bool operator!=(const OsiColCut& rhs) const; 
00075 
00076   
00077   
00078   //----------------------------------------------------------------
00079   
00089   inline virtual bool consistent() const; 
00090   
00098   inline virtual bool consistent(const OsiSolverInterface& im) const;
00099   
00108   inline virtual bool infeasible(const OsiSolverInterface &im) const;
00113   virtual double violated(const double * solution) const;
00115   
00116   //----------------------------------------------------------------
00117   
00120 
00121   OsiColCut & operator=( const OsiColCut& rhs);
00122   
00124   OsiColCut ( const OsiColCut &);
00125   
00127   OsiColCut ();
00128   
00130   virtual OsiColCut * clone() const;
00131   
00133   virtual ~OsiColCut ();
00135   
00138 
00139   virtual void print() const;
00141    
00142 private:
00143   
00146 
00147   CoinPackedVector lbs_;
00149   CoinPackedVector ubs_;
00151   
00152 };
00153 
00154 
00155 
00156 //-------------------------------------------------------------------
00157 // Set lower & upper bound vectors
00158 //------------------------------------------------------------------- 
00159 void OsiColCut::setLbs( 
00160                        int size, 
00161                        const int * colIndices, 
00162                        const double * lbElements )
00163 {
00164   lbs_.setVector(size,colIndices,lbElements);
00165 }
00166 //
00167 void OsiColCut::setUbs( 
00168                        int size, 
00169                        const int * colIndices, 
00170                        const double * ubElements )
00171 {
00172   ubs_.setVector(size,colIndices,ubElements);
00173 }
00174 //
00175 void OsiColCut::setLbs( const CoinPackedVector & lbs )
00176 {
00177   lbs_ = lbs;
00178 }
00179 //
00180 void OsiColCut::setUbs( const CoinPackedVector & ubs )
00181 {
00182   ubs_ = ubs;
00183 }
00184 
00185 //-------------------------------------------------------------------
00186 // Get Column Lower Bounds and Column Upper Bounds
00187 //-------------------------------------------------------------------
00188 const CoinPackedVector & OsiColCut::lbs() const 
00189 { 
00190   return lbs_; 
00191 }
00192 //
00193 const CoinPackedVector & OsiColCut::ubs() const 
00194 { 
00195   return ubs_; 
00196 }
00197 
00198 //----------------------------------------------------------------
00199 // == operator 
00200 //-------------------------------------------------------------------
00201 bool
00202 OsiColCut::operator==(
00203                       const OsiColCut& rhs) const
00204 {
00205   if ( this->OsiCut::operator!=(rhs) ) 
00206     return false;
00207   if ( lbs() != rhs.lbs() ) 
00208     return false;
00209   if ( ubs() != rhs.ubs() ) 
00210     return false;
00211   return true;
00212 }
00213 //
00214 bool
00215 OsiColCut::operator!=(
00216                       const OsiColCut& rhs) const
00217 {
00218   return !( (*this)==rhs );
00219 }
00220 
00221 //----------------------------------------------------------------
00222 // consistent & infeasible 
00223 //-------------------------------------------------------------------
00224 bool OsiColCut::consistent() const
00225 {
00226   const CoinPackedVector & lb = lbs();
00227   const CoinPackedVector & ub = ubs();
00228   // Test for consistent cut.
00229   // Are packed vectors consistent?
00230   lb.duplicateIndex("consistent", "OsiColCut");
00231   ub.duplicateIndex("consistent", "OsiColCut");
00232   if ( lb.getMinIndex() < 0 ) return false;
00233   if ( ub.getMinIndex() < 0 ) return false;
00234   return true;
00235 }
00236 //
00237 bool OsiColCut::consistent(const OsiSolverInterface& im) const
00238 {  
00239   const CoinPackedVector & lb = lbs();
00240   const CoinPackedVector & ub = ubs();
00241   
00242   // Test for consistent cut.
00243   if ( lb.getMaxIndex() >= im.getNumCols() ) return false;
00244   if ( ub.getMaxIndex() >= im.getNumCols() ) return false;
00245   
00246   return true;
00247 }
00248 
00249 #if 0
00250 bool OsiColCut::feasible(const OsiSolverInterface &im) const
00251 {
00252   const double * oldColLb = im.getColLower();
00253   const double * oldColUb = im.getColUpper();
00254   const CoinPackedVector & cutLbs = lbs();
00255   const CoinPackedVector & cutUbs = ubs();
00256   int i;
00257   
00258   for ( i=0; i<cutLbs.size(); i++ ) {
00259     int colIndx = cutLbs.indices()[i];
00260     double newLb;
00261     if ( cutLbs.elements()[i] > oldColLb[colIndx] )
00262       newLb = cutLbs.elements()[i];
00263     else
00264       newLb = oldColLb[colIndx];
00265 
00266     double newUb = oldColUb[colIndx];
00267     if ( cutUbs.indexExists(colIndx) )
00268       if ( cutUbs[colIndx] < newUb ) newUb = cutUbs[colIndx];
00269       if ( newLb > newUb ) 
00270         return false;
00271   }
00272   
00273   for ( i=0; i<cutUbs.size(); i++ ) {
00274     int colIndx = cutUbs.indices()[i];
00275     double newUb = cutUbs.elements()[i] < oldColUb[colIndx] ? cutUbs.elements()[i] : oldColUb[colIndx];
00276     double newLb = oldColLb[colIndx];
00277     if ( cutLbs.indexExists(colIndx) )
00278       if ( cutLbs[colIndx] > newLb ) newLb = cutLbs[colIndx];
00279       if ( newUb < newLb ) 
00280         return false;
00281   }
00282   
00283   return true;
00284 }
00285 #endif 
00286 
00287 
00288 bool OsiColCut::infeasible(const OsiSolverInterface &im) const
00289 {
00290   const double * oldColLb = im.getColLower();
00291   const double * oldColUb = im.getColUpper();
00292   const CoinPackedVector & cutLbs = lbs();
00293   const CoinPackedVector & cutUbs = ubs();
00294   int i;
00295   
00296   for ( i=0; i<cutLbs.getNumElements(); i++ ) {
00297     int colIndx = cutLbs.getIndices()[i];
00298     double newLb= cutLbs.getElements()[i] > oldColLb[colIndx] ?
00299        cutLbs.getElements()[i] : oldColLb[colIndx];
00300 
00301     double newUb = oldColUb[colIndx];
00302     if ( cutUbs.isExistingIndex(colIndx) )
00303       if ( cutUbs[colIndx] < newUb ) newUb = cutUbs[colIndx];
00304       if ( newLb > newUb ) 
00305         return true;
00306   }
00307   
00308   for ( i=0; i<cutUbs.getNumElements(); i++ ) {
00309     int colIndx = cutUbs.getIndices()[i];
00310     double newUb = cutUbs.getElements()[i] < oldColUb[colIndx] ?
00311        cutUbs.getElements()[i] : oldColUb[colIndx];
00312     double newLb = oldColLb[colIndx];
00313     if ( cutLbs.isExistingIndex(colIndx) )
00314       if ( cutLbs[colIndx] > newLb ) newLb = cutLbs[colIndx];
00315       if ( newUb < newLb ) 
00316         return true;
00317   }
00318   
00319   return false;
00320 }
00321 
00322 //#############################################################################
00328 void
00329 OsiColCutUnitTest(const OsiSolverInterface * baseSiP, 
00330                   const std::string & mpsDir);
00331 
00332 #endif

Generated on Sun Nov 14 14:06:39 2010 for Coin-All by  doxygen 1.4.7