00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef ClpSimplexDual_H
00011 #define ClpSimplexDual_H
00012
00013 #include "ClpSimplex.hpp"
00014
00022 class ClpSimplexDual : public ClpSimplex {
00023
00024 public:
00025
00117 int dual(int ifValuesPass,int startFinishOptions=0);
00126 int strongBranching(int numberVariables,const int * variables,
00127 double * newLower, double * newUpper,
00128 double ** outputSolution,
00129 int * outputStatus, int * outputIterations,
00130 bool stopOnFirstInfeasible=true,
00131 bool alwaysFinish=false,
00132 int startFinishOptions=0);
00134 ClpFactorization * setupForStrongBranching(char * arrays, int numberRows, int numberColumns);
00136 void cleanupAfterStrongBranching();
00138
00154 int whileIterating(double * & givenPi,int ifValuesPass);
00162 int updateDualsInDual(CoinIndexedVector * rowArray,
00163 CoinIndexedVector * columnArray,
00164 CoinIndexedVector * outputArray,
00165 double theta,
00166 double & objectiveChange,
00167 bool fullRecompute);
00171 void updateDualsInValuesPass(CoinIndexedVector * rowArray,
00172 CoinIndexedVector * columnArray,
00173 double theta);
00178 void flipBounds(CoinIndexedVector * rowArray,
00179 CoinIndexedVector * columnArray,
00180 double change);
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);
00245 int changeBounds(bool initialize,CoinIndexedVector * outputArray,
00246 double & changeCost);
00249 bool changeBound( int iSequence);
00251 void originalBound(int iSequence);
00254 int checkUnbounded(CoinIndexedVector * ray,CoinIndexedVector * spare,
00255 double changeCost);
00265 void statusOfProblemInDual(int & lastCleaned, int type,
00266 double * givenDjs, ClpDataSave & saveData,
00267 int ifValuesPass);
00269 void perturb();
00275 int fastDual(bool alwaysFinish=false);
00278 int numberAtFakeBound();
00279
00285 int pivotResult();
00287 int nextSuperBasic();
00290 int startupSolve(int ifValuesPass,double * saveDuals,int startFinishOptions);
00291 void finishSolve(int startFinishOptions);
00292 void gutsOfDual(int ifValuesPass,double * & saveDuals,int initialStatus,
00293 ClpDataSave & saveData);
00294
00295 void resetFakeBounds();
00296
00298 };
00299 #endif