@@ -51,13 +51,18 @@ TEST_CASE("lp-incompatible-bounds", "[iis]") {
5151 HighsIis iis;
5252 REQUIRE (highs.getIis (iis) == HighsStatus::kOk );
5353 REQUIRE (highs.getModelStatus () == HighsModelStatus::kInfeasible );
54+ REQUIRE (iis.valid_ == true );
55+ REQUIRE (iis.irreducible_ == true );
5456
5557 // Perform full IIS
5658 REQUIRE (highs.run () == HighsStatus::kOk );
5759 REQUIRE (highs.getModelStatus () == HighsModelStatus::kInfeasible );
5860
5961 highs.setOptionValue (" iis_strategy" , kIisStrategyFromLpRowPriority );
6062 REQUIRE (highs.getIis (iis) == HighsStatus::kOk );
63+ REQUIRE (highs.getModelStatus () == HighsModelStatus::kInfeasible );
64+ REQUIRE (iis.valid_ == true );
65+ REQUIRE (iis.irreducible_ == true );
6166 REQUIRE (iis.col_index_ .size () == 0 );
6267 REQUIRE (iis.row_index_ .size () == 1 );
6368 REQUIRE (iis.row_index_ [0 ] == 0 );
@@ -74,6 +79,9 @@ TEST_CASE("lp-incompatible-bounds", "[iis]") {
7479
7580 highs.setOptionValue (" iis_strategy" , kIisStrategyFromLpColPriority );
7681 REQUIRE (highs.getIis (iis) == HighsStatus::kOk );
82+ REQUIRE (highs.getModelStatus () == HighsModelStatus::kInfeasible );
83+ REQUIRE (iis.valid_ == true );
84+ REQUIRE (iis.irreducible_ == true );
7785 REQUIRE (iis.col_index_ .size () == 1 );
7886 REQUIRE (iis.row_index_ .size () == 0 );
7987 REQUIRE (iis.col_index_ [0 ] == 2 );
@@ -100,6 +108,9 @@ TEST_CASE("lp-incompatible-bounds", "[iis]") {
100108 highs.passModel (lp);
101109 highs.setOptionValue (" iis_strategy" , kIisStrategyFromLpRowPriority );
102110 REQUIRE (highs.getIis (iis) == HighsStatus::kOk );
111+ REQUIRE (highs.getModelStatus () == HighsModelStatus::kInfeasible );
112+ REQUIRE (iis.valid_ == true );
113+ REQUIRE (iis.irreducible_ == true );
103114 REQUIRE (iis.col_index_ .size () == 0 );
104115 REQUIRE (iis.row_index_ .size () == 1 );
105116 REQUIRE (iis.row_index_ [0 ] == 0 );
@@ -115,7 +126,10 @@ TEST_CASE("lp-incompatible-bounds", "[iis]") {
115126 }
116127
117128 highs.setOptionValue (" iis_strategy" , kIisStrategyFromLpColPriority );
129+ REQUIRE (highs.getModelStatus () == HighsModelStatus::kInfeasible );
118130 REQUIRE (highs.getIis (iis) == HighsStatus::kOk );
131+ REQUIRE (iis.valid_ == true );
132+ REQUIRE (iis.irreducible_ == true );
119133 REQUIRE (iis.col_index_ .size () == 1 );
120134 REQUIRE (iis.row_index_ .size () == 0 );
121135 REQUIRE (iis.col_index_ [0 ] == 0 );
@@ -156,6 +170,8 @@ TEST_CASE("lp-empty-infeasible-row", "[iis]") {
156170 // Get IIS for empty row with positive lower bound
157171 REQUIRE (highs.getIis (iis) == HighsStatus::kOk );
158172 REQUIRE (highs.getModelStatus () == HighsModelStatus::kInfeasible );
173+ REQUIRE (iis.valid_ == true );
174+ REQUIRE (iis.irreducible_ == true );
159175 if (dev_run && write_model) {
160176 highs.writeModel (" " );
161177 highs.writeIisModel (" " );
@@ -184,6 +200,8 @@ TEST_CASE("lp-empty-infeasible-row", "[iis]") {
184200 lp.row_upper_ [empty_row] = new_upper;
185201 REQUIRE (highs.getIis (iis) == HighsStatus::kOk );
186202 REQUIRE (highs.getModelStatus () == HighsModelStatus::kInfeasible );
203+ REQUIRE (iis.valid_ == true );
204+ REQUIRE (iis.irreducible_ == true );
187205 REQUIRE (iis.col_index_ .size () == 0 );
188206 REQUIRE (iis.row_index_ .size () == 1 );
189207 REQUIRE (iis.row_index_ [0 ] == empty_row);
@@ -236,20 +254,32 @@ TEST_CASE("lp-get-iis-light", "[iis]") {
236254 for (int k = 0 ; k < 2 ; k++) {
237255 REQUIRE (highs.getIis (iis) == HighsStatus::kOk );
238256 REQUIRE (highs.getModelStatus () == HighsModelStatus::kInfeasible );
257+ REQUIRE (iis.valid_ == true );
258+ REQUIRE (iis.irreducible_ == true );
239259 REQUIRE (iis.row_index_ .size () == 1 );
240-
241- printf (" Pass k = %d; l = %d: iis.row_index_[0] = %d\n " , k, l, int (iis.row_index_ [0 ]));
242- for (HighsInt iCol = 0 ; iCol < lp.num_col_ ; iCol++)
243- // REQUIRE(iis.col_status_[iCol] == kIisStatusNotInConflict);
244- printf (" Pass k = %d; l = %d: iis.col_status_[%d] = %d\n " , k, l, int (iCol), int (iis.col_status_ [iCol]));
260+ HighsInt iis_row = iis.row_index_ [0 ];
261+ if (lp.a_matrix_ .isColwise ()) {
262+ for (HighsInt iCol = 0 ; iCol < lp.num_col_ ; iCol++) {
263+ for (HighsInt iEl = lp.a_matrix_ .start_ [iCol]; iEl < lp.a_matrix_ .start_ [iCol+1 ]; iEl++) {
264+ if (lp.a_matrix_ .index_ [iEl] == iis_row) {
265+ REQUIRE (iis.col_status_ [iCol] == kIisStatusInConflict );
266+ break ;
267+ }
268+ }
269+ }
270+ } else {
271+ for (HighsInt iEl = lp.a_matrix_ .start_ [iis_row]; iEl < lp.a_matrix_ .start_ [iis_row+1 ]; iEl++) {
272+ HighsInt iCol = lp.a_matrix_ .index_ [iEl];
273+ REQUIRE (iis.col_status_ [iCol] == kIisStatusInConflict );
274+ }
275+ }
245276 for (HighsInt iRow = 0 ; iRow < lp.num_row_ ; iRow++) {
246277 if (iRow == iis.row_index_ [0 ]) {
247278 REQUIRE (iis.row_status_ [iRow] == kIisStatusInConflict );
248279 } else {
249280 REQUIRE (iis.row_status_ [iRow] == kIisStatusNotInConflict );
250281 }
251282 }
252-
253283 if (dev_run && write_model) {
254284 highs.writeModel (" " );
255285 highs.writeIisModel (" " );
@@ -312,11 +342,37 @@ TEST_CASE("lp-get-iis", "[iis]") {
312342 for (HighsInt k = 0 ; k < 2 ; k++) {
313343 REQUIRE (highs.getIis (iis) == HighsStatus::kOk );
314344 REQUIRE (highs.getModelStatus () == HighsModelStatus::kInfeasible );
345+ REQUIRE (iis.valid_ == true );
346+ REQUIRE (iis.irreducible_ == true );
315347 REQUIRE (iis.col_index_ .size () == 2 );
316348 REQUIRE (iis.row_index_ .size () == 1 );
317349 REQUIRE (iis.col_index_ [0 ] == 0 );
318350 REQUIRE (iis.col_index_ [1 ] == 1 );
319351 REQUIRE (iis.row_index_ [0 ] == 2 );
352+
353+ HighsInt iis_row = iis.row_index_ [0 ];
354+ if (lp.a_matrix_ .isColwise ()) {
355+ for (HighsInt iCol = 0 ; iCol < lp.num_col_ ; iCol++) {
356+ for (HighsInt iEl = lp.a_matrix_ .start_ [iCol]; iEl < lp.a_matrix_ .start_ [iCol+1 ]; iEl++) {
357+ if (lp.a_matrix_ .index_ [iEl] == iis_row) {
358+ REQUIRE (iis.col_status_ [iCol] == kIisStatusInConflict );
359+ break ;
360+ }
361+ }
362+ }
363+ } else {
364+ for (HighsInt iEl = lp.a_matrix_ .start_ [iis_row]; iEl < lp.a_matrix_ .start_ [iis_row+1 ]; iEl++) {
365+ HighsInt iCol = lp.a_matrix_ .index_ [iEl];
366+ REQUIRE (iis.col_status_ [iCol] == kIisStatusInConflict );
367+ }
368+ }
369+ for (HighsInt iRow = 0 ; iRow < lp.num_row_ ; iRow++) {
370+ if (iRow == iis.row_index_ [0 ]) {
371+ REQUIRE (iis.row_status_ [iRow] == kIisStatusInConflict );
372+ } else {
373+ REQUIRE (iis.row_status_ [iRow] == kIisStatusNotInConflict );
374+ }
375+ }
320376 highs.clearSolver ();
321377 highs.ensureRowwise ();
322378 REQUIRE (highs_lp.a_matrix_ .isRowwise ());
@@ -372,10 +428,8 @@ TEST_CASE("lp-get-iis-galenet", "[iis]") {
372428 //
373429 // Hence only empty columns can be removed
374430 std::string model = " galenet" ;
375- const HighsInt iis_strategy = kIisStrategyFromLpRowPriority
376- + kIisStrategyIrreducible ;
377- testMps (model, iis_strategy);
378- // testMps(model, kIisStrategyFromRayRowPriority);
431+ testMps (model, kIisStrategyFromLpRowPriority );
432+ // testMps(model, kIisStrategyFromLpRowPriority + kIisStrategyIrreducible);
379433}
380434
381435TEST_CASE (" lp-get-iis-avgas" , " [iis]" ) {
@@ -530,6 +584,14 @@ void testMps(std::string& model, const HighsInt iis_strategy,
530584 if (dev_run)
531585 printf (" Model %s has IIS with %d columns and %d rows\n " , model.c_str (),
532586 int (num_iis_col), int (num_iis_row));
587+ REQUIRE (iis.valid_ == true );
588+ const bool find_irreducible = kIisStrategyIrreducible & iis_strategy;
589+ const HighsInt iis_status = find_irreducible ? kIisStatusInConflict : kIisStatusMaybeInConflict ;
590+ REQUIRE (iis.irreducible_ == find_irreducible);
591+ for (HighsInt iX = 0 ; iX < num_iis_col; iX++)
592+ REQUIRE (iis.col_status_ [iis.col_index_ [iX]] == iis_status);
593+ for (HighsInt iX = 0 ; iX < num_iis_row; iX++)
594+ REQUIRE (iis.row_status_ [iis.row_index_ [iX]] == iis_status);
533595 } else {
534596 REQUIRE (num_iis_col == 0 );
535597 REQUIRE (num_iis_row == 0 );
@@ -584,6 +646,7 @@ TEST_CASE("feasible-lp-iis", "[iis]") {
584646 h.run ();
585647
586648 h.getIis (iis);
649+ REQUIRE (h.getModelStatus () == HighsModelStatus::kOptimal );
587650 REQUIRE (iis.col_index_ .size () == 0 );
588651 REQUIRE (iis.row_index_ .size () == 0 );
589652 REQUIRE (iis.col_status_ [0 ] == kIisStatusNotInConflict );
0 commit comments