Clp trunk
|
00001 /* $Id$ */ 00002 // Copyright (C) 2002, International Business Machines 00003 // Corporation and others. All Rights Reserved. 00004 // This code is licensed under the terms of the Eclipse Public License (EPL). 00005 /* 00006 Authors 00007 00008 John Forrest 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 //int dual2(int ifValuesPass,int startFinishOptions=0); 00297 void resetFakeBounds(int type); 00298 00300 }; 00301 #endif