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