@@ -5018,7 +5018,8 @@ HPresolve::Result HPresolve::enumerateSolutions(
50185018
50195019 auto handleSolution = [&](HighsInt row, size_t numVars, size_t & numSolutions,
50205020 size_t & numWorstCaseBounds,
5021- size_t & maxNumActiveCols, bool & noReductions) {
5021+ size_t & minNumActiveCols, size_t & maxNumActiveCols,
5022+ bool & noReductions) {
50225023 // propagate
50235024 domain.propagate ();
50245025 if (domain.infeasible ()) return ;
@@ -5064,11 +5065,13 @@ HPresolve::Result HPresolve::enumerateSolutions(
50645065 solutions[i][numSolutions] = solValue;
50655066 if (solValue != 0 ) numActiveCols++;
50665067 }
5068+ minNumActiveCols = std::min (minNumActiveCols, numActiveCols);
50675069 maxNumActiveCols = std::max (maxNumActiveCols, numActiveCols);
50685070
50695071 // if no reductions are possible, stop enumerating solutions
5070- noReductions = numWorstCaseBounds == 0 && maxNumActiveCols != 1 &&
5071- maxNumActiveCols != numVars - 1 ;
5072+ noReductions =
5073+ numWorstCaseBounds == 0 && maxNumActiveCols != 1 &&
5074+ (minNumActiveCols != numVars - 1 || maxNumActiveCols != numVars - 1 );
50725075 if (noReductions) {
50735076 for (size_t i = 0 ; i < numVars - 1 ; i++) {
50745077 for (size_t ii = i + 1 ; ii < numVars; ii++) {
@@ -5112,6 +5115,7 @@ HPresolve::Result HPresolve::enumerateSolutions(
51125115 HighsInt numBranches = -1 ;
51135116 size_t numWorstCaseBounds = 0 ;
51145117 size_t numSolutions = 0 ;
5118+ size_t minNumActiveCols = numVars;
51155119 size_t maxNumActiveCols = 0 ;
51165120 bool noReductions = false ;
51175121 while (true ) {
@@ -5120,7 +5124,7 @@ HPresolve::Result HPresolve::enumerateSolutions(
51205124 backtrack = solutionFound (numVars);
51215125 if (backtrack) {
51225126 handleSolution (row, numVars, numSolutions, numWorstCaseBounds,
5123- maxNumActiveCols, noReductions);
5127+ minNumActiveCols, maxNumActiveCols, noReductions);
51245128 if (noReductions) break ;
51255129 }
51265130 }
@@ -5141,7 +5145,8 @@ HPresolve::Result HPresolve::enumerateSolutions(
51415145 HPRESOLVE_CHECKED_CALL (handleInfeasibility (numSolutions == 0 ));
51425146
51435147 // check if all variables form a clique
5144- if (maxNumActiveCols == 1 || maxNumActiveCols == numVars - 1 ) {
5148+ if (maxNumActiveCols == 1 ||
5149+ (minNumActiveCols == numVars - 1 && maxNumActiveCols == numVars - 1 )) {
51455150 std::vector<HighsCliqueTable::CliqueVar> clique (numVars);
51465151 for (size_t i = 0 ; i < numVars; i++)
51475152 clique[i] =
0 commit comments