00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef AbcSimplexPrimal_H
00012 #define AbcSimplexPrimal_H
00013
00014 #include "AbcSimplex.hpp"
00015
00023 class AbcSimplexPrimal : public AbcSimplex {
00024
00025 public:
00026
00115 int primal(int ifValuesPass = 0, int startFinishOptions = 0);
00117
00120
00121 void alwaysOptimal(bool onOff);
00122 bool alwaysOptimal() const;
00127 void exactOutgoing(bool onOff);
00128 bool exactOutgoing() const;
00130
00145 int whileIterating(int valuesOption);
00146
00165 int pivotResult(int ifValuesPass = 0);
00166 int pivotResult4(int ifValuesPass = 0);
00167
00168
00173 int updatePrimalsInPrimal(CoinIndexedVector * rowArray,
00174 double theta,
00175 double & objectiveChange,
00176 int valuesPass);
00180 void updatePrimalsInPrimal(CoinIndexedVector & rowArray,
00181 double theta,bool valuesPass);
00184 void createUpdateDuals(CoinIndexedVector & rowArray,
00185 const double * originalCost,
00186 const double extraCost[4],
00187 double & objectiveChange,
00188 int valuesPass);
00191 double updateMinorCandidate(const CoinIndexedVector & updateBy,
00192 CoinIndexedVector & candidate,
00193 int sequenceIn);
00195 void updatePartialUpdate(CoinIndexedVector & partialUpdate);
00197 int doFTUpdate(CoinIndexedVector * vector[4]);
00206 void primalRow(CoinIndexedVector * rowArray,
00207 CoinIndexedVector * rhsArray,
00208 CoinIndexedVector * spareArray,
00209 int valuesPass);
00210 typedef struct {
00211 double theta_;
00212 double alpha_;
00213 double saveDualIn_;
00214 double dualIn_;
00215 double lowerIn_;
00216 double upperIn_;
00217 double valueIn_;
00218 int sequenceIn_;
00219 int directionIn_;
00220 double dualOut_;
00221 double lowerOut_;
00222 double upperOut_;
00223 double valueOut_;
00224 int sequenceOut_;
00225 int directionOut_;
00226 int pivotRow_;
00227 int valuesPass_;
00228 } pivotStruct;
00229 void primalRow(CoinIndexedVector * rowArray,
00230 CoinIndexedVector * rhsArray,
00231 CoinIndexedVector * spareArray,
00232 pivotStruct & stuff);
00240 void primalColumn(CoinPartitionedVector * updateArray,
00241 CoinPartitionedVector * spareRow2,
00242 CoinPartitionedVector * spareColumn1);
00243
00246 int checkUnbounded(CoinIndexedVector * ray, CoinIndexedVector * spare,
00247 double changeCost);
00257 void statusOfProblemInPrimal(int type);
00259 void perturb(int type);
00261 bool unPerturb();
00263 int unflag();
00269 int nextSuperBasic(int superBasicType, CoinIndexedVector * columnArray);
00270
00272 void primalRay(CoinIndexedVector * rowArray);
00274 void clearAll();
00275
00277 int lexSolve();
00278
00280 };
00281 #endif
00282