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