Skip to content

Commit f1afc85

Browse files
committed
Fixed Highs::forceHighsSolutionBasisSize() so that lengthened vectors are assigned values
1 parent dc27d34 commit f1afc85

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
@@ -4368,22 +4368,75 @@ void Highs::newHighsBasis() {
43684368
// model, and that the HiGHS basis is kept up-to-date with any solved
43694369
// basis
43704370
void Highs::forceHighsSolutionBasisSize() {
4371-
// Ensure that the HiGHS solution vectors are the right size
4372-
solution_.col_value.resize(model_.lp_.num_col_);
4373-
solution_.row_value.resize(model_.lp_.num_row_);
4374-
solution_.col_dual.resize(model_.lp_.num_col_);
4375-
solution_.row_dual.resize(model_.lp_.num_row_);
4371+
// Ensure that the HiGHS solution and basis vectors are the right size
4372+
//
4373+
// If the column or row, values or duals, are increased in size,
4374+
// ensure that values are assigned to the new entries, and that
4375+
// validity and status values are over-written in HighsSolution,
4376+
// HighsBasis and HighsInfo
4377+
const HighsInt num_col = this->model_.lp_.num_col_;
4378+
const HighsInt num_row = this->model_.lp_.num_row_;
4379+
HighsInt previous_size;
4380+
// Col values
4381+
previous_size = static_cast<HighsInt>(solution_.col_value.size());
4382+
solution_.col_value.resize(num_col);
4383+
if (previous_size < num_col) {
4384+
for (HighsInt iCol = previous_size; iCol < num_col; iCol++)
4385+
solution_.col_value[iCol] = 0;
4386+
solution_.value_valid = false;
4387+
info_.primal_solution_status = kSolutionStatusNone;
4388+
}
4389+
// Row values
4390+
previous_size = static_cast<HighsInt>(solution_.row_value.size());
4391+
solution_.row_value.resize(num_row);
4392+
if (previous_size < num_row) {
4393+
for (HighsInt iRow = previous_size; iRow < num_row; iRow++)
4394+
solution_.row_value[iRow] = 0;
4395+
solution_.value_valid = false;
4396+
info_.primal_solution_status = kSolutionStatusNone;
4397+
}
4398+
// Col duals
4399+
previous_size = static_cast<HighsInt>(solution_.col_dual.size());
4400+
solution_.col_dual.resize(num_col);
4401+
if (previous_size < num_col) {
4402+
for (HighsInt iCol = previous_size; iCol < num_col; iCol++)
4403+
solution_.col_dual[iCol] = 0;
4404+
solution_.dual_valid = false;
4405+
info_.dual_solution_status = kSolutionStatusNone;
4406+
}
4407+
// Row duals
4408+
previous_size = static_cast<HighsInt>(solution_.row_dual.size());
4409+
solution_.row_dual.resize(num_row);
4410+
if (previous_size < num_row) {
4411+
for (HighsInt iRow = previous_size; iRow < num_row; iRow++)
4412+
solution_.row_dual[iRow] = 0;
4413+
solution_.dual_valid = false;
4414+
info_.dual_solution_status = kSolutionStatusNone;
4415+
}
4416+
43764417
// Ensure that the HiGHS basis vectors are the right size,
43774418
// invalidating the basis if they aren't
4378-
if (basis_.col_status.size() != static_cast<size_t>(model_.lp_.num_col_)) {
4379-
basis_.col_status.resize(model_.lp_.num_col_);
4419+
previous_size = static_cast<HighsInt>(basis_.col_status.size());
4420+
if (previous_size != num_col) {
4421+
basis_.col_status.resize(num_col);
4422+
if (previous_size < num_col) {
4423+
for (HighsInt iCol = previous_size; iCol < num_col; iCol++)
4424+
basis_.col_status[iCol] = HighsBasisStatus::kNonbasic;
4425+
}
43804426
basis_.valid = false;
43814427
basis_.useful = false;
4382-
}
4383-
if (basis_.row_status.size() != static_cast<size_t>(model_.lp_.num_row_)) {
4384-
basis_.row_status.resize(model_.lp_.num_row_);
4428+
info_.basis_validity = kBasisValidityInvalid;
4429+
}
4430+
previous_size = static_cast<HighsInt>(basis_.row_status.size());
4431+
if (previous_size != num_row) {
4432+
basis_.row_status.resize(num_row);
4433+
if (previous_size < num_row) {
4434+
for (HighsInt iRow = previous_size; iRow < num_row; iRow++)
4435+
basis_.row_status[iRow] = HighsBasisStatus::kBasic;
4436+
}
43854437
basis_.valid = false;
43864438
basis_.useful = false;
4439+
info_.basis_validity = kBasisValidityInvalid;
43874440
}
43884441
}
43894442

0 commit comments

Comments
 (0)