00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef ClpSimplexDual_H
00012 #define ClpSimplexDual_H
00013
00014 #include "ClpSimplex.hpp"
00015
00023 class ClpSimplexDual : public ClpSimplex {
00024
00025 public:
00026
00118 int dual(int ifValuesPass, int startFinishOptions = 0);
00127 int strongBranching(int numberVariables, const int * variables,
00128 double * newLower, double * newUpper,
00129 double ** outputSolution,
00130 int * outputStatus, int * outputIterations,
00131 bool stopOnFirstInfeasible = true,
00132 bool alwaysFinish = false,
00133 int startFinishOptions = 0);
00135 ClpFactorization * setupForStrongBranching(char * arrays, int numberRows,
00136 int numberColumns, bool solveLp = false);
00138 void cleanupAfterStrongBranching(ClpFactorization * factorization);
00140
00156 int whileIterating(double * & givenPi, int ifValuesPass);
00164 int updateDualsInDual(CoinIndexedVector * rowArray,
00165 CoinIndexedVector * columnArray,
00166 CoinIndexedVector * outputArray,
00167 double theta,
00168 double & objectiveChange,
00169 bool fullRecompute);
00173 void updateDualsInValuesPass(CoinIndexedVector * rowArray,
00174 CoinIndexedVector * columnArray,
00175 double theta);
00179 void flipBounds(CoinIndexedVector * rowArray,
00180 CoinIndexedVector * columnArray);
00192 double dualColumn(CoinIndexedVector * rowArray,
00193 CoinIndexedVector * columnArray,
00194 CoinIndexedVector * spareArray,
00195 CoinIndexedVector * spareArray2,
00196 double accpetablePivot,
00197 CoinBigIndex * dubiousWeights);
00199 int dualColumn0(const CoinIndexedVector * rowArray,
00200 const CoinIndexedVector * columnArray,
00201 CoinIndexedVector * spareArray,
00202 double acceptablePivot,
00203 double & upperReturn, double &bestReturn, double & badFree);
00210 void checkPossibleValuesMove(CoinIndexedVector * rowArray,
00211 CoinIndexedVector * columnArray,
00212 double acceptablePivot);
00219 void checkPossibleCleanup(CoinIndexedVector * rowArray,
00220 CoinIndexedVector * columnArray,
00221 double acceptablePivot);
00226 void doEasyOnesInValuesPass(double * givenReducedCosts);
00236 void dualRow(int alreadyChosen);
00246 int changeBounds(int initialize, CoinIndexedVector * outputArray,
00247 double & changeCost);
00250 bool changeBound( int iSequence);
00252 void originalBound(int iSequence);
00255 int checkUnbounded(CoinIndexedVector * ray, CoinIndexedVector * spare,
00256 double changeCost);
00266 void statusOfProblemInDual(int & lastCleaned, int type,
00267 double * givenDjs, ClpDataSave & saveData,
00268 int ifValuesPass);
00271 int perturb();
00277 int fastDual(bool alwaysFinish = false);
00280 int numberAtFakeBound();
00281
00287 int pivotResult();
00289 int nextSuperBasic();
00292 int startupSolve(int ifValuesPass, double * saveDuals, int startFinishOptions);
00293 void finishSolve(int startFinishOptions);
00294 void gutsOfDual(int ifValuesPass, double * & saveDuals, int initialStatus,
00295 ClpDataSave & saveData);
00296
00297 void resetFakeBounds(int type);
00298
00300 };
00301 #endif