29 #define MAXSTALLS 10000 30 #define MAXSTALLRECOVERS 10 31 #define MAXREFACPIVOTS 10 51 bool reached = maxViolRedCost <
opttol() && maxViolBounds <
feastol() && maxViolConst <
feastol();
59 <<
" new tolerance = " << newpricertol
61 <<
" maxViolRedCost= " << maxViolRedCost
62 <<
" maxViolBounds= " << maxViolBounds
63 <<
" maxViolConst= " << maxViolConst
65 <<
" sumViolRedCost= " << sumViolRedCost
66 <<
" sumViolBounds= " << sumViolBounds
67 <<
" sumViolConst= " << sumViolConst
156 (*
spxout) <<
"starting value = " <<
value() << std::endl
157 <<
"starting shift = " <<
shift() << std::endl;
176 stallNumRecovers = 0;
180 bool tightened =
false;
202 int enterCycleCount = 0;
203 int enterFacPivotCount = 0;
210 stallRefShift =
shift();
211 stallRefValue =
value();
217 Real minpricertol = 0.01 * maxpricertol;
322 Real newpricertol = minpricertol;
334 if (newpricertol < minpricertol)
335 newpricertol = minpricertol;
378 enterFacPivotCount++;
392 <<
") reached" << std::endl; )
415 <<
"entering algorithm" << std::endl; );
438 MSG_INFO3( (*
spxout), (*
spxout) <<
" --- stalling detected - trying to recover by switching to LEAVING algorithm." << std::endl; )
446 MSG_INFO2( (*
spxout), (*
spxout) <<
" --- abort solving due to stalling in entering algorithm." << std::endl; );
456 stallRefShift =
shift();
457 stallRefValue =
value();
467 <<
", value: " <<
value()
468 <<
", shift: " <<
shift()
471 <<
", opttol: " <<
opttol()
473 <<
"ISOLVE56 stop: " << stop
475 <<
", solver status: " <<
m_status <<
" (" <<
int(
m_status) <<
")" << std::endl;
493 (*
spxout) <<
" --- maxInfeas: " << maxinfeas
494 <<
", shift: " <<
shift()
495 <<
", entertol: " <<
entertol() << std::endl;
517 int leaveCycleCount = 0;
518 int leaveFacPivotCount = 0;
525 stallRefShift =
shift();
526 stallRefValue =
value();
532 Real minpricertol = 0.01 * maxpricertol;
559 if (leaveNum < 0 && instableLeaveNum >= 0 &&
lastUpdate() == 0)
566 (*
spxout) <<
" --- trying instable leave iteration" << std::endl;
599 Real newpricertol = minpricertol;
610 if (newpricertol < minpricertol)
611 newpricertol = minpricertol;
654 leaveFacPivotCount++;
668 <<
") reached" << std::endl; )
690 MSG_INFO2( (*
spxout), (*
spxout) <<
" --- abort solving due to cycling in leaving algorithm" << std::endl; );
713 MSG_INFO3( (*
spxout), (*
spxout) <<
" --- stalling detected - trying to recover by switching to ENTERING algorithm." << std::endl; )
721 MSG_INFO2( (*
spxout), (*
spxout) <<
" --- abort solving due to stalling in leaving algorithm" << std::endl; );
731 stallRefShift =
shift();
732 stallRefValue =
value();
742 <<
", value: " <<
value()
743 <<
", shift: " <<
shift()
746 <<
", opttol: " <<
opttol()
748 <<
"ISOLVE57 stop: " << stop
750 <<
", solver status: " <<
m_status <<
" (" <<
int(
m_status) <<
")" << std::endl;
755 if(
shift() < minShift )
770 <<
", shift: " <<
shift()
772 <<
", cycle count: " << cycleCount << std::endl;
790 (*
spxout) <<
" --- maxInfeas: " << maxinfeas
791 <<
", shift: " <<
shift()
792 <<
", leavetol: " <<
leavetol() << std::endl;
826 tightenedtype =
type();
828 if( tightenedtype ==
ENTER )
856 MSG_INFO2( (*
spxout), (*
spxout) <<
" --- reloaded basis singular, resetting original tolerances" << std::endl; )
858 if( tightenedtype ==
ENTER )
873 stallNumRecovers = 0;
882 if( tightenedtype ==
ENTER )
900 if( tightenedtype ==
ENTER )
925 (*spxout) <<
")" << std::endl;
928 #ifdef ENABLE_ADDITIONAL_CHECKS
938 for(
int row = 0; row <
nRows(); ++row )
942 for( c = 0; c < rowvec.
size(); ++c )
943 val += rowvec.
value( c ) * sol[rowvec.
index( c )];
951 <<
" is violated by solution" << std::endl
952 <<
" lhs:" <<
lhs( row )
954 <<
" <= rhs:" <<
rhs( row ) << std::endl; )
959 for( c = 0; c <
nRows(); ++c )
964 assert( c <
nRows() );
967 <<
" fVec:" <<
fVec()[c]
968 <<
" fRhs:" <<
fRhs()[c]
969 <<
" fTest:" <<
fTest()[c] << std::endl; )
973 for(
int col = 0; col <
nCols(); ++col )
981 <<
" is violated by solution" << std::endl
982 <<
" lower:" <<
lower( col )
983 <<
" <= val:" << sol[col]
984 <<
" <= upper:" <<
upper( col ) << std::endl; )
988 for( c = 0; c <
nRows() ; ++c)
993 assert( c <
nRows() );
995 <<
" fVec:" <<
fVec()[c]
996 <<
" fRhs:" <<
fRhs()[c]
997 <<
" fTest:" <<
fTest()[c] << std::endl; )
1025 int nSuccessfulPivots;
1029 bool success =
false;
1045 nSuccessfulPivots = 0;
1047 for(
int i = 0; i <
dim() && !stop; ++i )
1057 MSG_DEBUG( std::cout <<
"try pivoting: " << polishId <<
" stat: " << stat; )
1058 success =
enter(polishId,
true);
1064 MSG_DEBUG( std::cout <<
" -> success!"; )
1065 ++nSuccessfulPivots;
1076 for(
int i = 0; i <
coDim() && !stop; ++i )
1087 MSG_DEBUG( std::cout <<
"try pivoting: " << polishId <<
" stat: " << stat; )
1088 success =
enter(polishId,
true);
1094 MSG_DEBUG( std::cout <<
" -> success!"; )
1095 ++nSuccessfulPivots;
1105 if( nSuccessfulPivots == 0 )
1115 nSuccessfulPivots = 0;
1117 for(
int i = 0; i <
coDim() && !stop; ++i )
1128 MSG_DEBUG( std::cout <<
"try pivoting: " << polishId <<
" stat: " << stat; )
1129 success =
enter(polishId,
true);
1135 MSG_DEBUG( std::cout <<
" -> success!"; )
1136 ++nSuccessfulPivots;
1145 if( nSuccessfulPivots == 0 )
1157 bool useIntegrality =
false;
1160 useIntegrality =
true;
1167 nSuccessfulPivots = 0;
1169 for(
int i = 0; i <
dim() && !stop; ++i )
1185 MSG_DEBUG( std::cout <<
"try pivoting: " << polishId <<
" stat: " << stat; )
1186 success =
leave(i,
true);
1192 MSG_DEBUG( std::cout <<
" -> success!"; )
1193 ++nSuccessfulPivots;
1201 if( nSuccessfulPivots == 0 )
1211 nSuccessfulPivots = 0;
1213 for(
int i = 0; i <
dim(); ++i )
1228 MSG_DEBUG( std::cout <<
"try pivoting: " << polishId <<
" stat: " << stat; )
1229 success =
leave(i,
true);
1235 MSG_DEBUG( std::cout <<
" -> success!"; )
1236 ++nSuccessfulPivots;
1247 if( nSuccessfulPivots == 0 )
1255 (*
spxout) <<
" --- finished solution polishing (" <<
polishCount <<
" pivots)" << std::endl; )
1274 << tmp.
length() << std::endl; )
1294 << tmp.
length() << std::endl; )
1304 for (
int i = 0; i <
dim(); ++i)
1313 <<
", leavetol()=" <<
leavetol() << std::endl; )
1317 for (
int i = 0; i <
coDim(); ++i)
1324 <<
", theTest[i]=" <<
theTest[i]
1325 <<
", leavetol()=" <<
leavetol() << std::endl; )
1338 (*spxout) <<
"type | time | iters | facts | shift | violation | obj value ";
1340 (*
spxout) <<
" | condition";
1341 (*spxout) << std::endl;
1346 (*spxout) << std::fixed << std::setw(7) << std::setprecision(1) <<
time() <<
" |";
1347 (*spxout) << std::scientific << std::setprecision(2);
1348 (*spxout) << std::setw(8) <<
iteration() <<
" | " 1352 << std::setprecision(8) <<
value();
1363 (*spxout) << std::endl;
1372 #ifdef ENABLE_ADDITIONAL_CHECKS 1383 #ifdef ENABLE_ADDITIONAL_CHECKS 1395 #ifdef ENABLE_ADDITIONAL_CHECKS 1400 << cr.
length() << std::endl; )
1403 << fr.
length() << std::endl; )
1437 <<
") reached" << std::endl; )
1469 <<
") reached" << std::endl; )
1471 (*
spxout) <<
" --- objective value limit reached" << std::endl
1472 <<
" (value: " <<
value()
1473 <<
", limit: " <<
objLimit <<
")" << std::endl
1474 <<
" (spxSense: " <<
int(
spxSense())
1475 <<
", rep: " <<
int(
rep())
1476 <<
", type: " <<
int(
type()) <<
")" << std::endl;
1518 Real iterationFrac = 0.6;
1530 Real degeneracyLevel = 0;
1531 Real degeneracyLB = 0.1;
1532 Real degeneracyUB = 0.9;
1534 if( (degeneracyLevel < degeneracyUB && degeneracyLevel > degeneracyLB) &&
iteration() >
nRows()*0.2 )
1578 for (
int i = 0; i <
nCols(); ++i)
1602 for (
int j = 0; j <
dim(); ++j)
1628 for (i =
nCols() - 1; i >= 0; --i)
1630 if (
baseId(i).isSPxRowId())
1659 for (i =
dim() - 1; i >= 0; --i)
1661 if (
baseId(i).isSPxColId())
1667 for (i =
dim() - 1; i >= 0; --i)
1669 if (
baseId(i).isSPxColId())
1736 for (i =
nRows() - 1; i >= 0; --i)
1741 p_vector[i] =
lhs(i);
1745 p_vector[i] =
rhs(i);
1760 for (i =
dim() - 1; i >= 0; --i)
1762 if (
baseId(i).isSPxRowId())
1784 for (
int j = 0; j <
dim(); ++j)
1804 for (
int i =
nCols() - 1; i >= 0; --i)
1806 if (
baseId(i).isSPxRowId())
1835 for (
int i =
dim() - 1; i >= 0; --i)
1837 if (
baseId(i).isSPxColId())
1869 for (
int i =
dim() - 1; i >= 0; --i)
1871 if (
baseId(i).isSPxRowId())
1935 *p_value = this->
value();
virtual void unShift(void)
remove shift as much as possible.
const VectorBase< Real > & rhs() const
Returns right hand side vector.
void computeFtest()
compute basis feasibility test vector.
virtual void entered4(SPxId, int)
performs entering pivot.
int iterDegenCheck
number of calls to change() since last degeneracy check
Rational spxAbs(const Rational &r)
Absolute.
virtual void setType(SPxSolver::Type)
sets Simplex type.
SPxId coId(int i) const
id of i 'th covector.
int iteration() const
returns number of basis changes since last load().
bool enter(SPxId &id, bool polish=false)
Exception class for things that should NEVER happen.This class is derived from the SoPlex exception b...
Vector & multWithBase(Vector &x) const
Vector-basis product.
SoPlex start basis generation base class.
virtual Real shift() const
total current shift amount.
int iterations() const
get number of iterations of current solution.
Basis is not known to be dual nor primal feasible.
void coSolve(Vector &x, const Vector &rhs)
Cosolves linear system with basis matrix.
virtual SPxId selectEnter()=0
selects Id to enter basis.
primal variable is fixed to both bounds
virtual Real getDelta()
get allowed bound violation
int boundflips
number of performed bound flips
primal or dual variable has no status
const VectorBase< Real > & upper() const
Returns upper bound vector.
const Vector & fTest() const
Violations of fVec.
virtual Status getPrimal(Vector &vector) const
get solution vector for primal variables.
DIdxSet updateViols
store indices that were changed in the previous iteration and must be checked in hyper pricing ...
SPxOut * spxout
message handler
bool sparsePricingLeave
These values enable or disable sparse pricing.
THREADLOCAL const Real infinity
bool leave(int i, bool polish=false)
Pricing pricing() const
return current Pricing.
virtual void qualRedCostViolation(Real &maxviol, Real &sumviol) const
get violation of optimality criterion.
Abstract pricer base class.
int size() const
Number of used indices.
Real leavetol() const
feasibility tolerance maintained by ratio test during LEAVE algorithm.
SSVector * solveVector3
when 3 systems are to be solved at a time; typically reserved for bound flipping ratio test (basic so...
void computeTest()
compute test vector in ENTERing Simplex.
int updateCount
number of calls to change() since last factorize()
minimize number of basic slack variables, i.e. more variables in between bounds
Basis is optimal, i.e. dual and primal feasible.
Real feastol() const
allowed primal feasibility tolerance.
Status & rowStatus(int i)
int lastIndex() const
returns index in basis where last update was done.
bool sparsePricingEnterCo
true if sparsePricing is turned on in the entering Simplex
virtual void qualBoundViolation(Real &maxviol, Real &sumviol) const
get violations of bounds.
bool LT(Real a, Real b, Real eps=Param::epsilon())
returns true iff a < b + eps
void setType(Type tp)
set LEAVE or ENTER algorithm.
Abstract ratio test base class.
solve() aborted due to iteration limit.
DataArray< int > isInfeasible
0: index not violated, 1: index violated, 2: index violated and among candidate list ...
No Problem has been loaded.
Real length() const
Floating point approximation of euclidian norm (without any approximation guarantee).
int number(const SPxRowId &id) const
Returns the row number of the row with identifier id.
void clear()
removes all indices.
virtual bool noViols(Real tol) const
check for violations above tol and immediately return false w/o checking the remaining values ...
int lastUpdate() const
returns number of basis changes since last refactorization.
int dim() const
dimension of basis matrix.
Vector & multBaseWith(Vector &x) const
Basis-vector product.
Real getFastCondition(int type=0)
LP has been proven to be primal infeasible.
R & value(int n)
Reference to value of n 'th nonzero.
bool isTimeLimitReached(const bool forceCheck=false)
returns whether current time limit is reached; call to time() may be skipped unless forceCheck is tru...
Ids for LP columns.Class SPxColId provides DataKeys for the column indices of an SPxLP.
Real time() const
time spent in last call to method solve().
int getDecompIterationLimit() const
returns the iteration limit for the decomposition simplex initialisation
void setDegenCompOffset(int iterOffset)
sets the offset for the number of iterations before the degeneracy is computed
void setPrimal(Vector &p_vector)
virtual Real value()
current objective value.
virtual void computeLeaveCoPrhs()
compute theCoPrhs for leaving Simplex.
int lastIterCount
number of calls to change() before halting the simplex
maximize number of basic slack variables, i.e. more variables on bounds
dual variable is left free, but unset
Real getDegeneracyLevel(Vector degenvec)
get level of dual degeneracy
Wrapper for different output streams and verbosity levels.
int nRows() const
Returns number of rows in LP.
virtual void start()=0
start timer, resume accounting user, system and real time.
virtual Real stop()=0
stop timer, return accounted user time.
const Vector & fRhs() const
right-hand side vector for fVec
virtual int getFactorCount() const =0
get number of factorizations
primal variable is set to its upper bound
Generic Ids for LP rows or columns.Both SPxColIds and SPxRowIds may be treated uniformly as SPxIds: ...
UpdateVector & coPvec() const
copricing vector.
virtual Status getDualfarkas(Vector &vector) const
get dual farkas proof of infeasibility.
int m_numCycle
actual number of degenerate steps so far.
int maxIters
maximum allowed iterations.
Real m_entertol
feasibility tolerance maintained during entering algorithm
SPxStatus status() const
returns current SPxStatus.
SSVector * coSolveVector3
when 3 systems are to be solved at a time; typically reserved for bound flipping ratio test (basic so...
bool isColBasic(int i) const
is the i 'th column vector basic ?
void setSlacks(Vector &p_vector)
void setStatus(SPxStatus stat)
sets basis SPxStatus to stat.
Status status() const
Status of solution process.
bool GT(Real a, Real b, Real eps=Param::epsilon())
returns true iff a > b + eps
virtual void left4(int, SPxId)
performs leaving pivot.
SPxSense spxSense() const
Returns the optimization sense.
int & index(int n)
Reference to index of n 'th nonzero.
Real m_pricingViol
maximal feasibility violation of current solution
Real entertol() const
feasibility tolerance maintained by ratio test during ENTER algorithm.
void performSolutionPolishing()
LP has been solved to optimality.
#define MSG_INFO2(spxout, x)
Prints out message x if the verbosity level is at least SPxOut::INFO2.
virtual bool precisionReached(Real &newpricertol) const
is the solution precise enough, or should we increase delta() ?
SPxId id(int i) const
id of i 'th vector.
UpdateVector & fVec() const
feasibility vector.
bool isSPxColId() const
is id a column id?
dual variable is set to its upper bound
solve() aborted due to commence decomposition simplex
solve() aborted due to time limit.
void addIdx(int i)
adds index i to the index set
bool isBasic(SPxBasis::Desc::Status stat) const
does stat describe a basic index ?
primal variable is left free, but unset
void setDual(Vector &p_vector)
solve() aborted to exit decomposition simplex
const VectorBase< Real > & lhs() const
Returns left hand side vector.
bool getComputeDegeneracy() const
returns whether the degeneracy is computed in each iteration
Real getEstimatedCondition()
int primalCount
number of primal iterations
int getDegenCompOffset() const
gets the offset for the number of iterations before the degeneracy is computed
bool sparsePricingEnter
true if sparsePricing is turned on in the entering Simplex for slack variables
int leaveCycles
the number of degenerate steps during the leaving algorithm
virtual void generate(SPxSolver &base)=0
generates start basis for loaded basis.
const VectorBase< Real > & maxRowObj() const
Timer * theTime
time spent in last call to method solve()
virtual void setDelta(Real newDelta)
set allowed bound violation
Status & colStatus(int i)
Real m_leavetol
feasibility tolerance maintained during leaving algorithm
#define MSG_INFO3(spxout, x)
Prints out message x if the verbosity level is at least SPxOut::INFO3.
Real m_pricingViolCo
maximal feasibility violation of current solution in coDim
Real epsilon() const
values are considered to be 0.
Debugging, floating point type and parameter definitions.
virtual void loadBasis(const SPxBasis::Desc &)
set a start basis.
virtual void setEpsilon(Real eps)
sets violation bound.
Status getResult(Real *value=0, Vector *primal=0, Vector *slacks=0, Vector *dual=0, Vector *reduCost=0)
get all results of last solve.
int totalboundflips
total number of bound flips
int polishCount
number of solution polishing iterations
SolutionPolish polishObj
objective of solution polishing
UpdateVector & pVec() const
pricing vector.
SSVector * solveVector2
when 2 systems are to be solved at a time; typically for speepest edge weights
bool isInitialized() const
has the internal data been initialized?
Status m_status
status of algorithm.
Exception base class.This class implements a base class for our SoPlex exceptions We provide a what()...
Everything should be within this namespace.
virtual void setType(SPxSolver::Type)
sets pricing type.
virtual bool terminate()
Termination criterion.
bool EQrel(Real a, Real b, Real eps=Param::epsilon())
returns true iff |relDiff(a,b)| <= eps
Real theCumulativeTime
cumulative time spent in all calls to method solve()
Real dualDegenSum
the sum of the dual degeneracy percentage
SPxId lastLeft() const
returns SPxId of last vector that left the basis.
virtual void printDisplayLine(const bool force=false, const bool forceHead=false)
print display line of flying table
solve() aborted due to detection of cycling.
int prevIteration() const
returns the number of iterations prior to the last break in execution
virtual SPxSolver * solver() const
returns loaded LP solver.
#define MSG_WARNING(spxout, x)
Prints out message x if the verbosity level is at least SPxOut::WARNING.
primal variable is set to its lower bound
const VectorBase< Real > & maxObj() const
Returns objective vector for maximization problem.
virtual void clearUpdateVecs(void)
int leaveCount
number of LEAVE iterations
nothing known on loaded problem.
don't perform modifications on optimal basis
const SVectorBase< Real > & rowVector(int i) const
Gets row vector of row i.
void computeFrhs()
compute feasibility vector from scratch.
virtual Real epsilon() const
returns violation bound theeps.
void clear()
Set vector to 0.
bool isSPxRowId() const
is id a row id?
SPxRatioTester * theratiotester
bool isValid() const
returns TRUE iff the id is a valid column or row identifier.
dual variable is set to its lower bound
int enterCycles
the number of degenerate steps during the entering algorithm
DSVector primalRay
stores primal ray in case of unboundedness
int size() const
return nr. of elements.
Type type() const
return current Type.
DataArray< int > isInfeasibleCo
0: index not violated, 1: index violated, 2: index violated and among candidate list ...
virtual SPxSolver * solver() const
returns loaded SPxSolver object.
int coDim() const
codimension.
virtual Status getRedCost(Vector &vector) const
get vector of reduced costs.
bool hyperPricingEnter
true if hyper sparse pricing is turned on in the entering Simplex
#define MSG_INFO1(spxout, x)
Prints out message x if the verbosity level is at least SPxOut::INFO1.
DSVector dualFarkas
stores dual farkas proof in case of infeasibility
int nCols() const
Returns number of columns in LP.
int enterCount
number of ENTER iterations
const SLinSolver * slinSolver() const
return loaded SLinSolver.
int printCondition
printing the current condition number in the log (0 - off, 1 - estimate,exact, 2 - exact)";ratio esti...
bool isCoBasic(int i) const
is the i 'th covector basic ?
DataArray< int > integerVariables
supplementary variable information, 0: continous variable, 1: integer variable
dual variable has two bounds
Real maxTime
maximum allowed time.
virtual int selectLeave()=0
returns selected index to leave basis.
Exception class for status exceptions during the computationsThis class is derived from the SoPlex ex...
virtual void init()
intialize data structures.
SPxId lastEntered() const
returns SPxId of last vector included to the basis.
Ids for LP rows.Class SPxRowId provides DataKeys for the row indices of an SPxLP. ...
virtual void computeEnterCoPrhs()
compute theCoPrhs for entering Simplex.
void forceRecompNonbasicValue()
virtual void qualConstraintViolation(Real &maxviol, Real &sumviol) const
get violation of constraints.
void solve(Vector &x, const Vector &rhs)
Textbook ratio test for SoPlex.
Real opttol() const
allowed optimality, i.e., dual feasibility tolerance.
virtual void reset()=0
initialize timer, set timing accounts to zero.
bool isRowBasic(int i) const
is the i 'th row vector basic ?
Real objLimit
< the number of calls to the method isTimeLimitReached()
void setDecompIterationLimit(int iterationLimit)
sets the iteration limit for the decomposition simplex initialisation
void computePvec()
compute entire pVec().
virtual void load(SPxSolver *lp, bool initSlackBasis=true)
loads the LP lp to the basis.
bool getStartingDecompBasis
flag to indicate whether the simplex is solved to get the starting improved dual simplex basis ...
const SPxBasis & basis() const
Return current basis.
int iterCount
number of calls to change() since last manipulation
Status
Status of a variable.
SSVector * coSolveVector2
when 2 systems are to be solved at a time; typically for speepest edge weights
virtual Status solve()
solve loaded LP.
LP has been proven to be primal unbounded.
virtual Real maxInfeas() const
maximal infeasibility of basis
DIdxSet infeasibilitiesCo
bool hyperPricingLeave
true if hyper sparse pricing is turned on in the leaving Simplex
const VectorBase< Real > & lower() const
Returns (internal and possibly scaled) lower bound vector.
const Desc & desc() const
Representation rep() const
return the current basis representation.
solve() aborted due to objective limit.
columnwise representation.
void setRedCost(Vector &p_vector)
virtual Status getDual(Vector &vector) const
get current solution vector for dual variables.
Basis is singular, numerical troubles?
virtual Status getPrimalray(Vector &vector) const
get primal ray in case of unboundedness.
virtual void factorize()
Factorize basis matrix.
Basis is primal feasible.
int lastDegenCheck() const
returns the number of iterations since the last degeneracy check
LP has a usable Basis (maybe LP is changed).
bool matrixIsSetup
true iff the pointers in matrix are set up correctly.
virtual Status getSlacks(Vector &vector) const
get vector of slack variables.
void setBasisStatus(SPxBasis::SPxStatus stat)
set the lp solver's basis status.
LP has been proven to be primal unbounded.
LP has been proven to be primal infeasible.
No Problem has been loaded to the basis.
void computeCoTest()
compute coTest vector.
Real primalDegenSum
the sum of the primal degeneracy percentage