diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index af8e9e76a..2780adf76 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -312,6 +312,7 @@ void Engine::performSimplexStep() unsigned tries = GlobalConfiguration::MAX_SIMPLEX_PIVOT_SEARCH_ITERATIONS; Set excludedEnteringVariables; unsigned bestLeaving = 0; + double bestChangeRatio = 0.0; while ( tries > 0 ) { @@ -340,6 +341,7 @@ void Engine::performSimplexStep() { bestEntering = _tableau->getEnteringVariableIndex(); bestLeaving = _tableau->getLeavingVariableIndex(); + bestChangeRatio = _tableau->getChangeRatio(); memcpy( _work, _tableau->getChangeColumn(), sizeof(double) * _tableau->getM() ); break; } @@ -352,6 +354,7 @@ void Engine::performSimplexStep() bestEntering = _tableau->getEnteringVariableIndex(); bestPivotEntry = pivotEntry; bestLeaving = leavingIndex; + bestChangeRatio = _tableau->getChangeRatio(); memcpy( _work, _tableau->getChangeColumn(), sizeof(double) * _tableau->getM() ); } @@ -397,6 +400,7 @@ void Engine::performSimplexStep() _tableau->setEnteringVariableIndex( bestEntering ); _tableau->setLeavingVariableIndex( bestLeaving ); _tableau->setChangeColumn( _work ); + _tableau->setChangeRatio( bestChangeRatio ); bool fakePivot = _tableau->performingFakePivot(); diff --git a/src/engine/ITableau.h b/src/engine/ITableau.h index edc6ee69c..9ad210c38 100644 --- a/src/engine/ITableau.h +++ b/src/engine/ITableau.h @@ -121,6 +121,7 @@ class ITableau virtual unsigned getLeavingVariable() const = 0; virtual unsigned getLeavingVariableIndex() const = 0; virtual double getChangeRatio() const = 0; + virtual void setChangeRatio( double changeRatio ) = 0; virtual bool performingFakePivot() const = 0; virtual void performPivot() = 0; virtual double ratioConstraintPerBasic( unsigned basicIndex, double coefficient, bool decrease ) = 0; diff --git a/src/engine/Tableau.cpp b/src/engine/Tableau.cpp index a50921c09..0742c91cc 100644 --- a/src/engine/Tableau.cpp +++ b/src/engine/Tableau.cpp @@ -889,6 +889,11 @@ double Tableau::getChangeRatio() const return _changeRatio; } +void Tableau::setChangeRatio( double changeRatio ) +{ + _changeRatio = changeRatio; +} + void Tableau::computeChangeColumn() { // _a gets the entering variable's column in A @@ -1694,9 +1699,30 @@ void Tableau::updateAssignmentForPivot() // If the change ratio is 0, just maintain the current assignment if ( FloatUtils::isZero( _changeRatio ) ) { + ASSERT( !performingFakePivot() ); + + DEBUG({ + // This should only happen when the basic variable is pressed against + // one of its bounds + if ( !( _basicStatus[_leavingVariable] == Tableau::AT_UB || + _basicStatus[_leavingVariable] == Tableau::AT_LB || + _basicStatus[_leavingVariable] == Tableau::BETWEEN + ) ) + { + printf( "Assertion violation!\n" ); + printf( "Basic (leaving) variable is: %u\n", _basicIndexToVariable[_leavingVariable] ); + printf( "Basic assignment: %.10lf. Bounds: [%.10lf, %.10lf]\n", + _basicAssignment[_leavingVariable], + _lowerBounds[_basicIndexToVariable[_leavingVariable]], + _upperBounds[_basicIndexToVariable[_leavingVariable]] ); + printf( "Basic status: %u\n", _basicStatus[_leavingVariable] ); + printf( "leavingVariableIncreases = %s", _leavingVariableIncreases ? "yes" : "no" ); + exit( 1 ); + } + }); + double basicAssignment = _basicAssignment[_leavingVariable]; double nonBasicAssignment = _nonBasicAssignment[_enteringVariable]; - _basicAssignment[_leavingVariable] = nonBasicAssignment; _nonBasicAssignment[_enteringVariable] = basicAssignment; return; diff --git a/src/engine/Tableau.h b/src/engine/Tableau.h index 8d18e036a..f62ce6ad4 100644 --- a/src/engine/Tableau.h +++ b/src/engine/Tableau.h @@ -208,6 +208,7 @@ class Tableau : public ITableau, public IBasisFactorization::BasisColumnOracle unsigned getLeavingVariable() const; unsigned getLeavingVariableIndex() const; double getChangeRatio() const; + void setChangeRatio( double changeRatio ); /* Returns true iff the current iteration is a fake pivot, i.e. the diff --git a/src/engine/tests/MockTableau.h b/src/engine/tests/MockTableau.h index 9ca7e1cca..9ae91f22a 100644 --- a/src/engine/tests/MockTableau.h +++ b/src/engine/tests/MockTableau.h @@ -260,6 +260,8 @@ class MockTableau : public ITableau } double getChangeRatio() const { return 0; } + void setChangeRatio( double /* changeRatio */ ) {} + void performPivot() {} bool performingFakePivot() const {