00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 #ifndef AbcNodeDesc_h_
00028 #define AbcNodeDesc_h_
00029 
00030 #include "CoinHelperFunctions.hpp"
00031 #include "CoinWarmStartBasis.hpp"
00032 
00033 #include "AlpsNodeDesc.h"
00034 #include "AbcModel.h"
00035 
00036 class OsiSolverInterface;
00037 
00038 class OsiCuts;
00039 class OsiRowCut;
00040 class OsiRowCutDebugger;
00041 
00042 class AbcModel;
00043 class AbcNode;
00044 
00045 
00046 
00047 
00048 class AbcNodeDesc : public AlpsNodeDesc {
00049   
00050  private:
00051     
00052     
00053 
00054 
00055 
00056 
00057     
00059     double* lowerBounds_;
00061     double* upperBounds_;
00062     
00065     int numberRows_;
00067     int numberCols_;
00068 
00070     int branchedOn_;
00071 
00073     double branchedOnVal_;
00074 
00076     int branchedDir_;    
00077  public:
00078     AbcNodeDesc()
00079         :
00080         AlpsNodeDesc(0),
00081         lowerBounds_(0), 
00082         upperBounds_(0),
00083         numberRows_(0),
00084         numberCols_(0),
00085         branchedOn_(-8),
00086         branchedOnVal_(0),
00087         branchedDir_(1)
00088         {
00089         }
00090 
00091     AbcNodeDesc(AbcModel* m) 
00092         :
00093         AlpsNodeDesc(m),
00094         lowerBounds_(0), 
00095         upperBounds_(0),
00096         numberRows_(0),
00097         numberCols_(0),
00098         branchedOn_(-9),
00099         branchedOnVal_(0),
00100         branchedDir_(1)
00101         {
00102         }  
00103   
00104     AbcNodeDesc(AbcModel* m, const double* lb, const double* ub) 
00105         :
00106         AlpsNodeDesc(m),
00107         branchedOn_(-10),
00108         branchedOnVal_(0),
00109         branchedDir_(1)
00110         {
00111             numberRows_ = m->solver()->getNumRows();
00112             numberCols_ = m->solver()->getNumCols();
00113             assert(numberRows_ && numberCols_);
00114             lowerBounds_ = new double [numberCols_];
00115             upperBounds_ = new double [numberCols_];
00116             memcpy(lowerBounds_, lb, sizeof(double)*numberCols_);
00117             memcpy(upperBounds_, ub, sizeof(double)*numberCols_);
00118         }
00119   
00120     virtual ~AbcNodeDesc() { 
00121         if (lowerBounds_ != 0) {
00122             delete [] lowerBounds_;
00123             lowerBounds_ = 0;
00124         }
00125         if (upperBounds_ != 0) {
00126             delete [] upperBounds_;
00127             upperBounds_ = 0;
00128         }
00129     }
00130 
00131     double* lowerBounds()
00132         {
00133             if(lowerBounds_ == 0) {
00134                 assert(model_);
00135                 AbcModel* m = dynamic_cast<AbcModel*>(model_);
00136                 const int num = m->getNumCols();
00137                 const double* lb = m->getColLower();
00138                 lowerBounds_ = new double [num];
00139                 memcpy(lowerBounds_, lb, sizeof(double)*num);
00140 
00141 
00142             }    
00143             return lowerBounds_;
00144         }
00145     
00146     void setLowerBounds(const double* lb, const int size) 
00147         {
00148             if(!lowerBounds_) {
00149                 lowerBounds_ = new double [size];
00150             }
00151             CoinCopyN(lb, size, lowerBounds_);
00152         }
00153     
00154     void setLowerBound(const int index, const double lb)
00155         {
00156             if(!lowerBounds_) {
00157                 AbcModel * model = dynamic_cast<AbcModel*>(model_);
00158                 const int numCols = model->getNumCols();    
00159                 assert(numCols > index);
00160                 lowerBounds_ = new double [numCols];
00161             }
00162 
00163             lowerBounds_[index] = lb;
00164         }
00165     
00166     double* upperBounds()
00167         {
00168             if(upperBounds_ == 0) {
00169                 assert(model_);
00170                 AbcModel* m = dynamic_cast<AbcModel*>(model_);
00171                 const int num = m->getNumCols();
00172                 const double* ub = m->getColUpper();
00173                 upperBounds_ = new double [num];
00174                 memcpy(upperBounds_, ub, sizeof(double)*num);
00175             }
00176             return upperBounds_;
00177         }
00178     
00179     void setUpperBounds(const double* ub, const int size) 
00180         {
00181             if(!upperBounds_) {
00182                 upperBounds_ = new double [size];
00183             }
00184             CoinCopyN(ub, size, upperBounds_);
00185         }
00186     
00187     void setUpperBound(const int index, const double ub)
00188         {
00189             if (!upperBounds_) {
00190                 AbcModel * model = dynamic_cast<AbcModel*>(model_);
00191                 const int numCols = model->getNumCols();    
00192                 assert(numCols > index);
00193                 upperBounds_ = new double [numCols];
00194             }
00195             
00196             upperBounds_[index] = ub;
00197         }
00199     void setBranchedOn(int b) { branchedOn_ = b; }
00201     void setBranchedDir(int d) { branchedDir_ = d; }
00203     void setBranchedOnValue(double b) { branchedOnVal_ = b; }
00205     int getBranchedOn() const { return branchedOn_; }
00207     int getBranchedDir() const { return branchedDir_; }
00209     double getBranchedOnValue() const { return branchedOnVal_; }        
00210 };
00211 
00212 #endif