@@ -4368,22 +4368,75 @@ void Highs::newHighsBasis() {
43684368// model, and that the HiGHS basis is kept up-to-date with any solved
43694369// basis
43704370void 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