#include <ClpSimplexOther.hpp>
Inheritance diagram for ClpSimplexOther:
Public Member Functions | |
Methods | |
void | dualRanging (int numberCheck, const int *which, double *costIncrease, int *sequenceIncrease, double *costDecrease, int *sequenceDecrease) |
Dual ranging. | |
void | primalRanging (int numberCheck, const int *which, double *valueIncrease, int *sequenceIncrease, double *valueDecrease, int *sequenceDecrease) |
Primal ranging. | |
int | parametrics (double startingTheta, double &endingTheta, double reportIncrement, const double *changeLowerBound, const double *changeUpperBound, const double *changeLowerRhs, const double *changeUpperRhs, const double *changeObjective) |
Parametrics This is an initial slow version. | |
int | parametricsLoop (double startingTheta, double &endingTheta, double reportIncrement, const double *changeLower, const double *changeUpper, const double *changeObjective, ClpDataSave &data, bool canTryQuick) |
Parametrics - inner loop This first attempt is when reportIncrement non zero and may not report endingTheta correctly If it can not reach input endingTheta return code will be 1 for infeasible, 2 for unbounded, otherwise 0. | |
void | statusOfProblemInParametrics (int type, ClpDataSave &saveData) |
Refactorizes if necessary Checks if finished. | |
int | whileIterating (double startingTheta, double &endingTheta, double reportIncrement, const double *changeLower, const double *changeUpper, const double *changeObjective) |
This has the flow between re-factorizations. | |
int | nextTheta (int type, double maxTheta, double *primalChange, double *dualChange, const double *changeLower, const double *changeUpper, const double *changeObjective) |
Computes next theta and says if objective or bounds (0= bounds, 1 objective, -1 none). | |
void | checkDualRatios (CoinIndexedVector *rowArray, CoinIndexedVector *columnArray, double &costIncrease, int &sequenceIncrease, double &alphaIncrease, double &costDecrease, int &sequenceDecrease, double &alphaDecrease) |
Row array has row part of pivot row Column array has column part. | |
void | checkPrimalRatios (CoinIndexedVector *rowArray, int direction) |
Row array has pivot column This is used in primal ranging. | |
int | writeBasis (const char *filename, bool writeValues=false, int formatType=0) const |
Write the basis in MPS format to the specified file. | |
int | readBasis (const char *filename) |
Read a basis from the given filename. | |
ClpSimplex * | dualOfModel () const |
Creates dual of a problem. | |
void | restoreFromDual (const ClpSimplex *dualProblem) |
Restores solution from dualized problem. | |
ClpSimplex * | crunch (double *rhs, int *whichRows, int *whichColumns, int &nBound, bool moreBounds=false, bool tightenBounds=false) |
Does very cursory presolve. | |
void | afterCrunch (const ClpSimplex &small, const int *whichRows, const int *whichColumns, int nBound) |
After very cursory presolve. | |
int | tightenIntegerBounds (double *rhsSpace) |
Tightens integer bounds - returns number tightened or -1 if infeasible. |
It inherits from ClpSimplex. It has no data of its own and is never created - only cast from a ClpSimplex object at algorithm time.
Definition at line 22 of file ClpSimplexOther.hpp.
void ClpSimplexOther::dualRanging | ( | int | numberCheck, | |
const int * | which, | |||
double * | costIncrease, | |||
int * | sequenceIncrease, | |||
double * | costDecrease, | |||
int * | sequenceDecrease | |||
) |
Dual ranging.
This computes increase/decrease in cost for each given variable and corresponding sequence numbers which would change basis. Sequence numbers are 0..numberColumns and numberColumns.. for artificials/slacks. For non-basic variables the information is trivial to compute and the change in cost is just minus the reduced cost and the sequence number will be that of the non-basic variables. For basic variables a ratio test is between the reduced costs for non-basic variables and the row of the tableau corresponding to the basic variable. The increase/decrease value is always >= 0.0
Up to user to provide correct length arrays where each array is of length numberCheck. which contains list of variables for which information is desired. All other arrays will be filled in by function. If fifth entry in which is variable 7 then fifth entry in output arrays will information for variable 7.
When here - guaranteed optimal
Reimplemented from ClpSimplex.
void ClpSimplexOther::primalRanging | ( | int | numberCheck, | |
const int * | which, | |||
double * | valueIncrease, | |||
int * | sequenceIncrease, | |||
double * | valueDecrease, | |||
int * | sequenceDecrease | |||
) |
Primal ranging.
This computes increase/decrease in value for each given variable and corresponding sequence numbers which would change basis. Sequence numbers are 0..numberColumns and numberColumns.. for artificials/slacks. For basic variables the sequence number will be that of the basic variables.
Up to user to provide correct length arrays where each array is of length numberCheck. which contains list of variables for which information is desired. All other arrays will be filled in by function. If fifth entry in which is variable 7 then fifth entry in output arrays will information for variable 7.
When here - guaranteed optimal
Reimplemented from ClpSimplex.
int ClpSimplexOther::parametrics | ( | double | startingTheta, | |
double & | endingTheta, | |||
double | reportIncrement, | |||
const double * | changeLowerBound, | |||
const double * | changeUpperBound, | |||
const double * | changeLowerRhs, | |||
const double * | changeUpperRhs, | |||
const double * | changeObjective | |||
) |
Parametrics This is an initial slow version.
The code uses current bounds + theta * change (if change array not NULL) and similarly for objective. It starts at startingTheta and returns ending theta in endingTheta. If reportIncrement 0.0 it will report on any movement If reportIncrement >0.0 it will report at startingTheta+k*reportIncrement. If it can not reach input endingTheta return code will be 1 for infeasible, 2 for unbounded, if error on ranges -1, otherwise 0. Normal report is just theta and objective but if event handler exists it may do more On exit endingTheta is maximum reached (can be used for next startingTheta)
int ClpSimplexOther::parametricsLoop | ( | double | startingTheta, | |
double & | endingTheta, | |||
double | reportIncrement, | |||
const double * | changeLower, | |||
const double * | changeUpper, | |||
const double * | changeObjective, | |||
ClpDataSave & | data, | |||
bool | canTryQuick | |||
) |
Parametrics - inner loop This first attempt is when reportIncrement non zero and may not report endingTheta correctly If it can not reach input endingTheta return code will be 1 for infeasible, 2 for unbounded, otherwise 0.
Normal report is just theta and objective but if event handler exists it may do more
void ClpSimplexOther::statusOfProblemInParametrics | ( | int | type, | |
ClpDataSave & | saveData | |||
) |
Refactorizes if necessary Checks if finished.
Updates status.
type - 0 initial so set up save arrays etc
int ClpSimplexOther::whileIterating | ( | double | startingTheta, | |
double & | endingTheta, | |||
double | reportIncrement, | |||
const double * | changeLower, | |||
const double * | changeUpper, | |||
const double * | changeObjective | |||
) |
This has the flow between re-factorizations.
Reasons to come out: -1 iterations etc -2 inaccuracy -3 slight inaccuracy (and done iterations) +0 looks optimal (might be unbounded - but we will investigate) +1 looks infeasible +3 max iterations
int ClpSimplexOther::nextTheta | ( | int | type, | |
double | maxTheta, | |||
double * | primalChange, | |||
double * | dualChange, | |||
const double * | changeLower, | |||
const double * | changeUpper, | |||
const double * | changeObjective | |||
) |
Computes next theta and says if objective or bounds (0= bounds, 1 objective, -1 none).
theta is in theta_. type 1 bounds, 2 objective, 3 both.
void ClpSimplexOther::checkDualRatios | ( | CoinIndexedVector * | rowArray, | |
CoinIndexedVector * | columnArray, | |||
double & | costIncrease, | |||
int & | sequenceIncrease, | |||
double & | alphaIncrease, | |||
double & | costDecrease, | |||
int & | sequenceDecrease, | |||
double & | alphaDecrease | |||
) |
Row array has row part of pivot row Column array has column part.
This is used in dual ranging
void ClpSimplexOther::checkPrimalRatios | ( | CoinIndexedVector * | rowArray, | |
int | direction | |||
) |
Row array has pivot column This is used in primal ranging.
int ClpSimplexOther::writeBasis | ( | const char * | filename, | |
bool | writeValues = false , |
|||
int | formatType = 0 | |||
) | const |
Write the basis in MPS format to the specified file.
If writeValues true writes values of structurals (and adds VALUES to end of NAME card)
Row and column names may be null. formatType is
Returns non-zero on I/O error
Reimplemented from ClpSimplex.
int ClpSimplexOther::readBasis | ( | const char * | filename | ) |
ClpSimplex* ClpSimplexOther::dualOfModel | ( | ) | const |
Creates dual of a problem.
void ClpSimplexOther::restoreFromDual | ( | const ClpSimplex * | dualProblem | ) |
Restores solution from dualized problem.
ClpSimplex* ClpSimplexOther::crunch | ( | double * | rhs, | |
int * | whichRows, | |||
int * | whichColumns, | |||
int & | nBound, | |||
bool | moreBounds = false , |
|||
bool | tightenBounds = false | |||
) |
Does very cursory presolve.
rhs is numberRows, whichRows is 3*numberRows and whichColumns is 2*numberColumns.
void ClpSimplexOther::afterCrunch | ( | const ClpSimplex & | small, | |
const int * | whichRows, | |||
const int * | whichColumns, | |||
int | nBound | |||
) |
After very cursory presolve.
rhs is numberRows, whichRows is 3*numberRows and whichColumns is 2*numberColumns.
int ClpSimplexOther::tightenIntegerBounds | ( | double * | rhsSpace | ) |
Tightens integer bounds - returns number tightened or -1 if infeasible.