diff --git a/src/engine/Tableau.cpp b/src/engine/Tableau.cpp index e591d745b..0465bdcae 100644 --- a/src/engine/Tableau.cpp +++ b/src/engine/Tableau.cpp @@ -976,7 +976,8 @@ void Tableau::dumpAssignment() for ( unsigned i = 0; i < _n; ++i ) { bool basic = _basicVariables.exists( i ); - printf( "\tx%u --> %.5lf [%s]. ", i, getValue( i ), basic ? "B" : "NB" ); + printf( "\tx%u (index: %u) --> %.5lf [%s]. ", i, _variableToIndex[i], + getValue( i ), basic ? "B" : "NB" ); if ( _lowerBounds[i] != FloatUtils::negativeInfinity() ) printf( "Range: [ %.5lf, ", _lowerBounds[i] ); else @@ -1688,6 +1689,17 @@ void Tableau::updateAssignmentForPivot() _basicAssignmentStatus = ITableau::BASIC_ASSIGNMENT_UPDATED; + // If the change ratio is 0, just maintain the current assignment + if ( FloatUtils::isZero( _changeRatio ) ) + { + double basicAssignment = _basicAssignment[_leavingVariable]; + double nonBasicAssignment = _nonBasicAssignment[_enteringVariable]; + + _basicAssignment[_leavingVariable] = nonBasicAssignment; + _nonBasicAssignment[_enteringVariable] = basicAssignment; + return; + } + if ( performingFakePivot() ) { // A non-basic is hopping from one bound to the other. @@ -1759,7 +1771,7 @@ void Tableau::updateAssignmentForPivot() continue; if ( FloatUtils::isZero( _changeColumn[i] ) ) - continue; + continue; _basicAssignment[i] -= _changeColumn[i] * nonBasicDelta; notifyVariableValue( _basicIndexToVariable[i], _basicAssignment[i] ); diff --git a/src/engine/tests/Test_Tableau.h b/src/engine/tests/Test_Tableau.h index 23fe7de3f..ec277a770 100644 --- a/src/engine/tests/Test_Tableau.h +++ b/src/engine/tests/Test_Tableau.h @@ -1023,7 +1023,8 @@ class TableauTestSuite : public CxxTest::TestSuite tableau->setEnteringVariableIndex( 3u ); tableau->computeChangeColumn(); - tableau->setLeavingVariableIndex( 3u ); + tableau->pickLeavingVariable(); + TS_ASSERT_EQUALS( tableau->getEnteringVariable(), 3u ); TS_ASSERT_EQUALS( tableau->getLeavingVariable(), 3u );