Skip to content

Commit 9fda01e

Browse files
committed
Now setting just the bounds given by col/row_bounds in the IIS; formated
1 parent a84beb7 commit 9fda01e

File tree

5 files changed

+46
-41
lines changed

5 files changed

+46
-41
lines changed

check/TestIis.cpp

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ void testFeasibilityRelaxation(
2020
const double require_feasibility_objective_function_value);
2121

2222
void checkIisLp(HighsLp& lp, const HighsIis& iis, const HighsLp& iis_lp);
23-
23+
2424
TEST_CASE("lp-incompatible-bounds", "[iis]") {
2525
// LP has row0 and col2 with inconsistent bounds.
2626
//
@@ -51,17 +51,11 @@ TEST_CASE("lp-incompatible-bounds", "[iis]") {
5151
HighsIis iis;
5252
REQUIRE(highs.getIis(iis) == HighsStatus::kOk);
5353
checkIisLp(lp, iis, iis_lp);
54-
REQUIRE(highs.passModel(iis_lp) == HighsStatus::kOk);
55-
highs.writeModel("");
56-
REQUIRE(highs.run() == HighsStatus::kOk);
57-
REQUIRE(highs.getModelStatus() == HighsModelStatus::kInfeasible);
58-
59-
/*
6054
// Perform full IIS
6155
REQUIRE(highs.run() == HighsStatus::kOk);
6256
REQUIRE(highs.getModelStatus() == HighsModelStatus::kInfeasible);
6357
highs.setOptionValue("iis_strategy", kIisStrategyFromLpRowPriority);
64-
HighsIis iis;
58+
6559
REQUIRE(highs.getIis(iis) == HighsStatus::kOk);
6660
REQUIRE(iis.col_index_.size() == 0);
6761
REQUIRE(iis.row_index_.size() == 1);
@@ -73,7 +67,7 @@ TEST_CASE("lp-incompatible-bounds", "[iis]") {
7367
REQUIRE(iis.row_index_.size() == 0);
7468
REQUIRE(iis.col_index_[0] == 2);
7569
REQUIRE(iis.col_bound_[0] == kIisBoundStatusBoxed);
76-
*/
70+
7771
highs.resetGlobalScheduler(true);
7872
}
7973

@@ -502,24 +496,30 @@ void checkIisLp(HighsLp& lp, const HighsIis& iis, const HighsLp& iis_lp) {
502496
for (HighsInt iisRow = 0; iisRow < iis_num_row; iisRow++) {
503497
HighsInt iRow = iis.row_index_[iisRow];
504498
iis_row[iRow] = iisRow;
505-
REQUIRE(iis_lp.row_lower_[iisRow] == lp.row_lower_[iRow]);
506-
REQUIRE(iis_lp.row_upper_[iisRow] == lp.row_upper_[iRow]);
499+
HighsInt row_bound = iis.row_bound_[iisRow];
500+
if (row_bound == kIisBoundStatusLower || row_bound == kIisBoundStatusBoxed)
501+
REQUIRE(iis_lp.row_lower_[iisRow] == lp.row_lower_[iRow]);
502+
if (row_bound == kIisBoundStatusUpper || row_bound == kIisBoundStatusBoxed)
503+
REQUIRE(iis_lp.row_upper_[iisRow] == lp.row_upper_[iRow]);
507504
}
508-
505+
509506
// Work through the LP columns and matrix, checking the costs,
510-
// bounds and matrix index/value
507+
// bounds and matrix index/value
511508
for (HighsInt iisCol = 0; iisCol < iis_num_col; iisCol++) {
512509
HighsInt iCol = iis.col_index_[iisCol];
513510
REQUIRE(iis_lp.col_cost_[iisCol] == lp.col_cost_[iCol]);
514-
REQUIRE(iis_lp.col_lower_[iisCol] == lp.col_lower_[iCol]);
515-
REQUIRE(iis_lp.col_upper_[iisCol] == lp.col_upper_[iCol]);
511+
HighsInt col_bound = iis.col_bound_[iisCol];
512+
if (col_bound == kIisBoundStatusLower || col_bound == kIisBoundStatusBoxed)
513+
REQUIRE(iis_lp.col_lower_[iisCol] == lp.col_lower_[iCol]);
514+
if (col_bound == kIisBoundStatusUpper || col_bound == kIisBoundStatusBoxed)
515+
REQUIRE(iis_lp.col_upper_[iisCol] == lp.col_upper_[iCol]);
516516
for (HighsInt iEl = lp.a_matrix_.start_[iCol];
517-
iEl < lp.a_matrix_.start_[iCol+1]; iEl++) {
517+
iEl < lp.a_matrix_.start_[iCol + 1]; iEl++) {
518518
HighsInt iRow = lp.a_matrix_.index_[iEl];
519519
HighsInt iisRow = iis_row[iRow];
520520
if (iisRow >= 0) {
521-
REQUIRE(iis_lp.a_matrix_.index_[iisCol] == iisRow);
522-
REQUIRE(iis_lp.a_matrix_.value_[iisCol] == lp.a_matrix_.value_[iEl]);
521+
REQUIRE(iis_lp.a_matrix_.index_[iisCol] == iisRow);
522+
REQUIRE(iis_lp.a_matrix_.value_[iisCol] == lp.a_matrix_.value_[iEl]);
523523
}
524524
}
525525
}
@@ -532,18 +532,17 @@ void checkIisLp(HighsLp& lp, const HighsIis& iis, const HighsLp& iis_lp) {
532532
index.assign(lp.num_row_, -1);
533533
value.assign(lp.num_row_, 0);
534534
for (HighsInt iEl = lp.a_matrix_.start_[iCol];
535-
iEl < lp.a_matrix_.start_[iCol+1]; iEl++) {
535+
iEl < lp.a_matrix_.start_[iCol + 1]; iEl++) {
536536
HighsInt iRow = lp.a_matrix_.index_[iEl];
537537
index[iRow] = iis_row[iRow];
538538
value[iRow] = lp.a_matrix_.value_[iEl];
539539
}
540540
for (HighsInt iEl = iis_lp.a_matrix_.start_[iCol];
541-
iEl < iis_lp.a_matrix_.start_[iCol+1]; iisCol++) {
541+
iEl < iis_lp.a_matrix_.start_[iCol + 1]; iisCol++) {
542542
HighsInt iisRow = iis_lp.a_matrix_.index_[iEl];
543-
HighsInt iRow = iis.row_index_[iisRow];
543+
HighsInt iRow = iis.row_index_[iisRow];
544544
REQUIRE(index[iRow] == iisRow);
545545
REQUIRE(value[iRow] == iis_lp.a_matrix_.value_[iEl]);
546546
}
547547
}
548548
}
549-

highs/Highs.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -574,8 +574,8 @@ class Highs {
574574
HighsStatus getIis(HighsIis& iis);
575575

576576
/**
577-
* @brief Get an LP corresponding to (any) irreducible infeasible subsystem (IIS)
578-
* information for the incumbent model
577+
* @brief Get an LP corresponding to (any) irreducible infeasible subsystem
578+
* (IIS) information for the incumbent model
579579
*/
580580
HighsStatus getIisLp(HighsLp& lp);
581581

highs/lp_data/HConst.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,8 @@ enum PresolveRuleType : int {
271271
enum IisStrategy {
272272
kIisStrategyMin = 0,
273273
kIisStrategyLight = kIisStrategyMin, // 0
274-
kIisStrategyFromLpRowPriority, // 1
275-
kIisStrategyFromLpColPriority, // 2
274+
kIisStrategyFromLpRowPriority, // 1
275+
kIisStrategyFromLpColPriority, // 2
276276
// kIisStrategyFromRayRowPriority, // 3
277277
// kIisStrategyFromRayColPriority, // 4
278278
kIisStrategyMax = kIisStrategyFromLpColPriority

highs/lp_data/Highs.cpp

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1947,11 +1947,11 @@ HighsStatus Highs::getIis(HighsIis& iis) {
19471947

19481948
HighsStatus Highs::getIisLp(HighsLp& iis_lp) {
19491949
HighsStatus return_status = HighsStatus::kOk;
1950-
1950+
19511951
if (!this->iis_.valid_) {
1952-
return_status =
1953-
interpretCallStatus(options_.log_options, this->getIisInterface(),
1954-
return_status, "getIisInterface");
1952+
return_status =
1953+
interpretCallStatus(options_.log_options, this->getIisInterface(),
1954+
return_status, "getIisInterface");
19551955
if (return_status == HighsStatus::kError) return return_status;
19561956
}
19571957
iis_lp.clear();
@@ -1964,30 +1964,35 @@ HighsStatus Highs::getIisLp(HighsLp& iis_lp) {
19641964
for (HighsInt iisRow = 0; iisRow < iis_num_row; iisRow++) {
19651965
HighsInt iRow = this->iis_.row_index_[iisRow];
19661966
iis_row[iRow] = iisRow;
1967-
iis_lp.row_lower_.push_back(lp.row_lower_[iRow]);
1968-
iis_lp.row_upper_.push_back(lp.row_upper_[iRow]);
1967+
HighsInt row_bound = this->iis_.row_bound_[iisRow];
1968+
if (row_bound == kIisBoundStatusLower || row_bound == kIisBoundStatusBoxed)
1969+
iis_lp.row_lower_.push_back(lp.row_lower_[iRow]);
1970+
if (row_bound == kIisBoundStatusUpper || row_bound == kIisBoundStatusBoxed)
1971+
iis_lp.row_upper_.push_back(lp.row_upper_[iRow]);
19691972
}
1970-
1973+
19711974
for (HighsInt iisCol = 0; iisCol < iis_num_col; iisCol++) {
19721975
HighsInt iCol = this->iis_.col_index_[iisCol];
19731976
iis_lp.col_cost_.push_back(lp.col_cost_[iCol]);
1974-
iis_lp.col_lower_.push_back(lp.col_lower_[iCol]);
1975-
iis_lp.col_upper_.push_back(lp.col_upper_[iCol]);
1977+
HighsInt col_bound = this->iis_.col_bound_[iisCol];
1978+
if (col_bound == kIisBoundStatusLower || col_bound == kIisBoundStatusBoxed)
1979+
iis_lp.col_lower_.push_back(lp.col_lower_[iCol]);
1980+
if (col_bound == kIisBoundStatusUpper || col_bound == kIisBoundStatusBoxed)
1981+
iis_lp.col_upper_.push_back(lp.col_upper_[iCol]);
19761982
for (HighsInt iEl = lp.a_matrix_.start_[iCol];
1977-
iEl < lp.a_matrix_.start_[iCol+1]; iisCol++) {
1983+
iEl < lp.a_matrix_.start_[iCol + 1]; iisCol++) {
19781984
HighsInt iRow = lp.a_matrix_.index_[iEl];
19791985
HighsInt iisRow = iis_row[iRow];
19801986
if (iisRow >= 0) {
1981-
iis_lp.a_matrix_.index_.push_back(iisRow);
1982-
iis_lp.a_matrix_.value_.push_back(lp.a_matrix_.value_[iEl]);
1987+
iis_lp.a_matrix_.index_.push_back(iisRow);
1988+
iis_lp.a_matrix_.value_.push_back(lp.a_matrix_.value_[iEl]);
19831989
}
19841990
}
19851991
iis_lp.a_matrix_.start_.push_back(iis_lp.a_matrix_.index_.size());
19861992
}
19871993
iis_lp.num_col_ = iis_lp.col_cost_.size();
19881994
iis_lp.num_row_ = iis_lp.row_lower_.size();
19891995
return return_status;
1990-
19911996
}
19921997

19931998
HighsStatus Highs::getDualObjectiveValue(

highs/lp_data/HighsInterface.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1866,8 +1866,9 @@ HighsStatus Highs::getIisInterface() {
18661866
if (this->model_status_ == HighsModelStatus::kOptimal ||
18671867
this->model_status_ == HighsModelStatus::kUnbounded) {
18681868
// Strange to call getIis for a model that's known to be feasible
1869-
highsLogUser(options_.log_options, HighsLogType::kInfo,
1870-
"Calling Highs::getIis for a model that is known to be feasible\n");
1869+
highsLogUser(
1870+
options_.log_options, HighsLogType::kInfo,
1871+
"Calling Highs::getIis for a model that is known to be feasible\n");
18711872
this->iis_.invalidate();
18721873
// No IIS exists, so validate the empty HighsIis instance
18731874
this->iis_.valid_ = true;

0 commit comments

Comments
 (0)