Clp  1.16.11
ClpSimplexDual.hpp
Go to the documentation of this file.
1 /* $Id: ClpSimplexDual.hpp 1761 2011-07-06 16:06:24Z forrest $ */
2 // Copyright (C) 2002, International Business Machines
3 // Corporation and others. All Rights Reserved.
4 // This code is licensed under the terms of the Eclipse Public License (EPL).
5 /*
6  Authors
7 
8  John Forrest
9 
10  */
11 #ifndef ClpSimplexDual_H
12 #define ClpSimplexDual_H
13 
14 #include "ClpSimplex.hpp"
15 
23 class ClpSimplexDual : public ClpSimplex {
24 
25 public:
26 
118  int dual(int ifValuesPass, int startFinishOptions = 0);
127  int strongBranching(int numberVariables, const int * variables,
128  double * newLower, double * newUpper,
129  double ** outputSolution,
130  int * outputStatus, int * outputIterations,
131  bool stopOnFirstInfeasible = true,
132  bool alwaysFinish = false,
133  int startFinishOptions = 0);
136  int numberColumns, bool solveLp = false);
140 
156  int whileIterating(double * & givenPi, int ifValuesPass);
164  int updateDualsInDual(CoinIndexedVector * rowArray,
165  CoinIndexedVector * columnArray,
166  CoinIndexedVector * outputArray,
167  double theta,
168  double & objectiveChange,
169  bool fullRecompute);
173  void updateDualsInValuesPass(CoinIndexedVector * rowArray,
174  CoinIndexedVector * columnArray,
175  double theta);
179  void flipBounds(CoinIndexedVector * rowArray,
180  CoinIndexedVector * columnArray);
192  double dualColumn(CoinIndexedVector * rowArray,
193  CoinIndexedVector * columnArray,
194  CoinIndexedVector * spareArray,
195  CoinIndexedVector * spareArray2,
196  double accpetablePivot,
197  CoinBigIndex * dubiousWeights);
199  int dualColumn0(const CoinIndexedVector * rowArray,
200  const CoinIndexedVector * columnArray,
201  CoinIndexedVector * spareArray,
202  double acceptablePivot,
203  double & upperReturn, double &bestReturn, double & badFree);
210  void checkPossibleValuesMove(CoinIndexedVector * rowArray,
211  CoinIndexedVector * columnArray,
212  double acceptablePivot);
219  void checkPossibleCleanup(CoinIndexedVector * rowArray,
220  CoinIndexedVector * columnArray,
221  double acceptablePivot);
226  void doEasyOnesInValuesPass(double * givenReducedCosts);
236  void dualRow(int alreadyChosen);
246  int changeBounds(int initialize, CoinIndexedVector * outputArray,
247  double & changeCost);
250  bool changeBound( int iSequence);
252  void originalBound(int iSequence);
255  int checkUnbounded(CoinIndexedVector * ray, CoinIndexedVector * spare,
256  double changeCost);
266  void statusOfProblemInDual(int & lastCleaned, int type,
267  double * givenDjs, ClpDataSave & saveData,
268  int ifValuesPass);
271  int perturb();
277  int fastDual(bool alwaysFinish = false);
281 
291  int startupSolve(int ifValuesPass, double * saveDuals, int startFinishOptions);
292  void finishSolve(int startFinishOptions);
293  void gutsOfDual(int ifValuesPass, double * & saveDuals, int initialStatus,
295  //int dual2(int ifValuesPass,int startFinishOptions=0);
296  void resetFakeBounds(int type);
297 
299 };
300 #endif
ClpSimplex
This solves LPs using the simplex method.
Definition: ClpSimplex.hpp:70
ClpFactorization
This just implements CoinFactorization when an ClpMatrixBase object is passed.
Definition: ClpFactorization.hpp:39
ClpSimplex::theta
double theta() const
Theta (pivot change)
Definition: ClpSimplex.hpp:1182
ClpSimplexDual::changeBounds
int changeBounds(int initialize, CoinIndexedVector *outputArray, double &changeCost)
Checks if any fake bounds active - if so returns number and modifies updatedDualBound_ and everything...
ClpSimplexDual::strongBranching
int strongBranching(int numberVariables, const int *variables, double *newLower, double *newUpper, double **outputSolution, int *outputStatus, int *outputIterations, bool stopOnFirstInfeasible=true, bool alwaysFinish=false, int startFinishOptions=0)
For strong branching.
ClpSimplexDual
This solves LPs using the dual simplex method.
Definition: ClpSimplexDual.hpp:23
ClpSimplexDual::gutsOfDual
void gutsOfDual(int ifValuesPass, double *&saveDuals, int initialStatus, ClpDataSave &saveData)
ClpSimplex::rowArray
CoinIndexedVector * rowArray(int index) const
Useful row length arrays (0,1,2,3,4,5)
Definition: ClpSimplex.hpp:727
ClpSimplexDual::updateDualsInDual
int updateDualsInDual(CoinIndexedVector *rowArray, CoinIndexedVector *columnArray, CoinIndexedVector *outputArray, double theta, double &objectiveChange, bool fullRecompute)
The duals are updated by the given arrays.
ClpSimplexDual::updateDualsInValuesPass
void updateDualsInValuesPass(CoinIndexedVector *rowArray, CoinIndexedVector *columnArray, double theta)
The duals are updated by the given arrays.
ClpSimplexDual::dualRow
void dualRow(int alreadyChosen)
Chooses dual pivot row Would be faster with separate region to scan and will have this (with square o...
ClpSimplex::columnArray
CoinIndexedVector * columnArray(int index) const
Useful column length arrays (0,1,2,3,4,5)
Definition: ClpSimplex.hpp:731
ClpSimplexDual::doEasyOnesInValuesPass
void doEasyOnesInValuesPass(double *givenReducedCosts)
This sees if we can move duals in dual values pass.
ClpDataSave
This is a tiny class where data can be saved round calls.
Definition: ClpModel.hpp:1269
ClpSimplexDual::originalBound
void originalBound(int iSequence)
Restores bound to original bound.
ClpSimplexDual::whileIterating
int whileIterating(double *&givenPi, int ifValuesPass)
This has the flow between re-factorizations Broken out for clarity and will be used by strong branchi...
ClpModel::ray
double * ray() const
For advanced users - no need to delete - sign not changed.
Definition: ClpModel.hpp:772
ClpSimplexDual::changeBound
bool changeBound(int iSequence)
As changeBounds but just changes new bounds for a single variable.
ClpSimplexDual::numberAtFakeBound
int numberAtFakeBound()
Checks number of variables at fake bounds.
ClpSimplexDual::checkUnbounded
int checkUnbounded(CoinIndexedVector *ray, CoinIndexedVector *spare, double changeCost)
Checks if tentative optimal actually means unbounded in dual Returns -3 if not, 2 if is unbounded.
ClpSimplexDual::fastDual
int fastDual(bool alwaysFinish=false)
Fast iterations.
ClpSimplexDual::startupSolve
int startupSolve(int ifValuesPass, double *saveDuals, int startFinishOptions)
Startup part of dual (may be extended to other algorithms) returns 0 if good, 1 if bad.
ClpSimplexDual::setupForStrongBranching
ClpFactorization * setupForStrongBranching(char *arrays, int numberRows, int numberColumns, bool solveLp=false)
This does first part of StrongBranching.
ClpSimplexDual::flipBounds
void flipBounds(CoinIndexedVector *rowArray, CoinIndexedVector *columnArray)
While updateDualsInDual sees what effect is of flip this does actual flipping.
ClpSimplex::factorization
ClpFactorization * factorization() const
factorization
Definition: ClpSimplex.hpp:607
ClpSimplexDual::pivotResultPart1
int pivotResultPart1()
Pivot in a variable and choose an outgoing one.
ClpSimplex.hpp
ClpSimplexDual::cleanupAfterStrongBranching
void cleanupAfterStrongBranching(ClpFactorization *factorization)
This cleans up after strong branching.
ClpSimplexDual::dualColumn
double dualColumn(CoinIndexedVector *rowArray, CoinIndexedVector *columnArray, CoinIndexedVector *spareArray, CoinIndexedVector *spareArray2, double accpetablePivot, CoinBigIndex *dubiousWeights)
Row array has row part of pivot row Column array has column part.
ClpSimplexDual::nextSuperBasic
int nextSuperBasic()
Get next free , -1 if none.
ClpSimplexDual::dualColumn0
int dualColumn0(const CoinIndexedVector *rowArray, const CoinIndexedVector *columnArray, CoinIndexedVector *spareArray, double acceptablePivot, double &upperReturn, double &bestReturn, double &badFree)
Does first bit of dualColumn.
ClpSimplex::saveData
ClpDataSave saveData()
Save data.
ClpSimplexDual::perturb
int perturb()
Perturbs problem (method depends on perturbation()) returns nonzero if should go to dual.
ClpSimplexDual::dual
int dual(int ifValuesPass, int startFinishOptions=0)
Dual algorithm.
ClpSimplexDual::checkPossibleValuesMove
void checkPossibleValuesMove(CoinIndexedVector *rowArray, CoinIndexedVector *columnArray, double acceptablePivot)
Row array has row part of pivot row Column array has column part.
ClpModel::numberColumns
int numberColumns() const
Definition: ClpModel.hpp:325
ClpSimplexDual::finishSolve
void finishSolve(int startFinishOptions)
ClpSimplexDual::statusOfProblemInDual
void statusOfProblemInDual(int &lastCleaned, int type, double *givenDjs, ClpDataSave &saveData, int ifValuesPass)
Refactorizes if necessary Checks if finished.
ClpSimplexDual::checkPossibleCleanup
void checkPossibleCleanup(CoinIndexedVector *rowArray, CoinIndexedVector *columnArray, double acceptablePivot)
Row array has row part of pivot row Column array has column part.
ClpSimplexDual::resetFakeBounds
void resetFakeBounds(int type)
ClpModel::numberRows
int numberRows() const
Number of rows.
Definition: ClpModel.hpp:315