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
00028
00029
00030 #include "BcpsBranchObject.h"
00031
00032 #include "BlisModel.h"
00033
00034
00035
00036
00037
00038 class BlisBranchObjectInt : public BcpsBranchObject {
00039
00040 protected:
00041
00044 double down_[2];
00045
00048 double up_[2];
00049
00050 public:
00051
00053 BlisBranchObjectInt()
00054 :
00055 BcpsBranchObject()
00056 {
00057 type_ = BlisBranchingObjectTypeInt;
00058 down_[0] = 0.0;
00059 down_[1] = 0.0;
00060 up_[0] = 0.0;
00061 up_[1] = 0.0;
00062 }
00063
00069 BlisBranchObjectInt(BlisModel * model,
00070 int varInd,
00071 int direction,
00072 double value)
00073 :
00074 BcpsBranchObject(model, varInd, direction, value)
00075 {
00076 type_ = BlisBranchingObjectTypeInt;
00077 int iColumn = model->getIntColIndices()[objectIndex_];
00078 down_[0] = model->solver()->getColLower()[iColumn];
00079 down_[1] = floor(value_);
00080 up_[0] = ceil(value_);
00081 up_[1] = model->getColUpper()[iColumn];
00082 }
00083
00091 BlisBranchObjectInt(BlisModel * model,
00092 int varInd,
00093 int intScore,
00094 double dblScore,
00095 int direction,
00096 double value)
00097 :
00098 BcpsBranchObject(model, varInd, intScore, dblScore, direction, value)
00099 {
00100 type_ = BlisBranchingObjectTypeInt;
00101 int iColumn = model->getIntColIndices()[objectIndex_];
00102 down_[0] = model->solver()->getColLower()[iColumn];
00103 down_[1] = floor(value_);
00104 up_[0] = ceil(value_);
00105 up_[1] = model->getColUpper()[iColumn];
00106 }
00107
00113 BlisBranchObjectInt(BlisModel * model,
00114 int varInd,
00115 int direction,
00116 double lowerValue,
00117 double upperValue)
00118 :
00119 BcpsBranchObject(model, varInd, direction, lowerValue)
00120 {
00121 type_ = BlisBranchingObjectTypeInt;
00122 numBranchesLeft_ = 1;
00123 down_[0] = lowerValue;
00124 down_[1] = upperValue;
00125 up_[0] = lowerValue;
00126 up_[1] = upperValue;
00127 }
00128
00130 BlisBranchObjectInt(const BlisBranchObjectInt &);
00131
00133 BlisBranchObjectInt & operator = (const BlisBranchObjectInt& rhs);
00134
00136 virtual BcpsBranchObject * clone() const {
00137 return (new BlisBranchObjectInt(*this));
00138 }
00139
00141 virtual ~BlisBranchObjectInt() {}
00142
00146 virtual double branch(bool normalBranch = false);
00147
00149 virtual void print(bool normalBranch);
00150
00152 const double *getDown() const { return down_; }
00153
00155 const double *getUp() const { return up_; }
00156
00157 protected:
00158
00160 AlpsReturnStatus encodeBlis(AlpsEncoded *encoded) const {
00161 assert(encoded);
00162 AlpsReturnStatus status = AlpsReturnStatusOk;
00163 int j;
00164
00165 for (j = 0; j < 2; ++j) {
00166 encoded->writeRep(down_[j]);
00167 }
00168 for (j = 0; j < 2; ++j) {
00169 encoded->writeRep(up_[j]);
00170 }
00171
00172 return status;
00173 }
00174
00176 AlpsReturnStatus decodeBlis(AlpsEncoded &encoded) {
00177 AlpsReturnStatus status = AlpsReturnStatusOk;
00178 int j;
00179
00180 for (j = 0; j < 2; ++j) {
00181 encoded.readRep(down_[j]);
00182 }
00183 for (j = 0; j < 2; ++j) {
00184 encoded.readRep(up_[j]);
00185 }
00186
00187 return status;
00188 }
00189
00190 public:
00191
00193 virtual AlpsReturnStatus encode(AlpsEncoded *encoded) const {
00194 AlpsReturnStatus status = AlpsReturnStatusOk;
00195
00196 status = encodeBcps(encoded);
00197 status = encodeBlis(encoded);
00198
00199 return status;
00200 }
00201
00203 virtual AlpsReturnStatus decode(AlpsEncoded &encoded) {
00204
00205 AlpsReturnStatus status = AlpsReturnStatusOk;
00206
00207 status = decodeBcps(encoded);
00208 status = decodeBlis(encoded);
00209
00210 return status;
00211 }
00212
00213 };
00214