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