Skip to content

Commit ba46f84

Browse files
committed
Merge branch 'fix-force-highs-solution-basis-size' into fix-2521
2 parents 928448a + f1afc85 commit ba46f84

File tree

1 file changed

+63
-10
lines changed

1 file changed

+63
-10
lines changed

highs/lp_data/Highs.cpp

Lines changed: 63 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4372,22 +4372,75 @@ void Highs::newHighsBasis() {
43724372
// model, and that the HiGHS basis is kept up-to-date with any solved
43734373
// basis
43744374
void Highs::forceHighsSolutionBasisSize() {
4375-
// Ensure that the HiGHS solution vectors are the right size
4376-
solution_.col_value.resize(model_.lp_.num_col_);
4377-
solution_.row_value.resize(model_.lp_.num_row_);
4378-
solution_.col_dual.resize(model_.lp_.num_col_);
4379-
solution_.row_dual.resize(model_.lp_.num_row_);
4375+
// Ensure that the HiGHS solution and basis vectors are the right size
4376+
//
4377+
// If the column or row, values or duals, are increased in size,
4378+
// ensure that values are assigned to the new entries, and that
4379+
// validity and status values are over-written in HighsSolution,
4380+
// HighsBasis and HighsInfo
4381+
const HighsInt num_col = this->model_.lp_.num_col_;
4382+
const HighsInt num_row = this->model_.lp_.num_row_;
4383+
HighsInt previous_size;
4384+
// Col values
4385+
previous_size = static_cast<HighsInt>(solution_.col_value.size());
4386+
solution_.col_value.resize(num_col);
4387+
if (previous_size < num_col) {
4388+
for (HighsInt iCol = previous_size; iCol < num_col; iCol++)
4389+
solution_.col_value[iCol] = 0;
4390+
solution_.value_valid = false;
4391+
info_.primal_solution_status = kSolutionStatusNone;
4392+
}
4393+
// Row values
4394+
previous_size = static_cast<HighsInt>(solution_.row_value.size());
4395+
solution_.row_value.resize(num_row);
4396+
if (previous_size < num_row) {
4397+
for (HighsInt iRow = previous_size; iRow < num_row; iRow++)
4398+
solution_.row_value[iRow] = 0;
4399+
solution_.value_valid = false;
4400+
info_.primal_solution_status = kSolutionStatusNone;
4401+
}
4402+
// Col duals
4403+
previous_size = static_cast<HighsInt>(solution_.col_dual.size());
4404+
solution_.col_dual.resize(num_col);
4405+
if (previous_size < num_col) {
4406+
for (HighsInt iCol = previous_size; iCol < num_col; iCol++)
4407+
solution_.col_dual[iCol] = 0;
4408+
solution_.dual_valid = false;
4409+
info_.dual_solution_status = kSolutionStatusNone;
4410+
}
4411+
// Row duals
4412+
previous_size = static_cast<HighsInt>(solution_.row_dual.size());
4413+
solution_.row_dual.resize(num_row);
4414+
if (previous_size < num_row) {
4415+
for (HighsInt iRow = previous_size; iRow < num_row; iRow++)
4416+
solution_.row_dual[iRow] = 0;
4417+
solution_.dual_valid = false;
4418+
info_.dual_solution_status = kSolutionStatusNone;
4419+
}
4420+
43804421
// Ensure that the HiGHS basis vectors are the right size,
43814422
// invalidating the basis if they aren't
4382-
if (basis_.col_status.size() != static_cast<size_t>(model_.lp_.num_col_)) {
4383-
basis_.col_status.resize(model_.lp_.num_col_);
4423+
previous_size = static_cast<HighsInt>(basis_.col_status.size());
4424+
if (previous_size != num_col) {
4425+
basis_.col_status.resize(num_col);
4426+
if (previous_size < num_col) {
4427+
for (HighsInt iCol = previous_size; iCol < num_col; iCol++)
4428+
basis_.col_status[iCol] = HighsBasisStatus::kNonbasic;
4429+
}
43844430
basis_.valid = false;
43854431
basis_.useful = false;
4386-
}
4387-
if (basis_.row_status.size() != static_cast<size_t>(model_.lp_.num_row_)) {
4388-
basis_.row_status.resize(model_.lp_.num_row_);
4432+
info_.basis_validity = kBasisValidityInvalid;
4433+
}
4434+
previous_size = static_cast<HighsInt>(basis_.row_status.size());
4435+
if (previous_size != num_row) {
4436+
basis_.row_status.resize(num_row);
4437+
if (previous_size < num_row) {
4438+
for (HighsInt iRow = previous_size; iRow < num_row; iRow++)
4439+
basis_.row_status[iRow] = HighsBasisStatus::kBasic;
4440+
}
43894441
basis_.valid = false;
43904442
basis_.useful = false;
4443+
info_.basis_validity = kBasisValidityInvalid;
43914444
}
43924445
}
43934446

0 commit comments

Comments
 (0)