@@ -2984,41 +2984,45 @@ void Highs::restoreInfCost(HighsStatus& return_status) {
29842984 }
29852985}
29862986
2987- // Update model status, data and solution with respect to non-trivial
2988- // user bound/cost scaling
2989- HighsStatus Highs::optionChangeAction () {
2990- /*
2991- HighsModel& model = this->model_;
2992- HighsLp& lp = model.lp_;
2993- HighsInfo& info = this->info_;
2994- HighsOptions& options = this->options_;
2995- HighsInt dl_user_cost_scale = options.user_cost_scale - lp.user_cost_scale_;
2996- HighsInt dl_user_bound_scale =
2997- options.user_bound_scale - lp.user_bound_scale_;
2998-
2999- if (dl_user_cost_scale || dl_user_bound_scale) {
3000- HighsUserScaleData user_scale_data;
3001- initialiseUserScaleData(lp, options_, user_scale_data);
3002- user_scale_data.user_cost_scale = dl_user_cost_scale;
3003- user_scale_data.user_bound_scale = dl_user_bound_scale;
3004- HighsStatus return_status = userScaleModel(model, user_scale_data, options.log_options);
3005- if (return_status == HighsStatus::kError) {
3006- options.user_cost_scale = lp.user_cost_scale_;
3007- options.user_bound_scale = lp.user_bound_scale_;
3008- highsLogUser(
3009- options_.log_options, HighsLogType::kError,
3010- "New user cost/bound scaling yields excessive costs/bounds: "
3011- "reverting user cost scaling to %d, and user bound scaling to %d\n",
3012- int(lp.user_cost_scale_), int(lp.user_bound_scale_));
3013- return HighsStatus::kError;
2987+ HighsStatus Highs::userScaleModel (HighsUserScaleData& data) {
2988+ userScaleLp (this ->model_ .lp_ , data, false );
2989+ userScaleHessian (this ->model_ .hessian_ , data, false );
2990+ HighsStatus return_status = userScaleStatus (this ->options_ .log_options , data);
2991+ if (return_status == HighsStatus::kError ) return HighsStatus::kError ;
2992+ userScaleLp (this ->model_ .lp_ , data);
2993+ userScaleHessian (this ->model_ .hessian_ , data);
2994+ return return_status;
2995+ }
2996+
2997+ HighsStatus Highs::userScaleSolution (HighsUserScaleData& data, bool update_kkt) {
2998+ HighsStatus return_status = HighsStatus::kOk ;
2999+ if (!data.user_cost_scale && !data.user_bound_scale ) return HighsStatus::kOk ;
3000+ double cost_scale_value = std::pow (2 , data.user_cost_scale );
3001+ double bound_scale_value = std::pow (2 , data.user_bound_scale );
3002+ const HighsLp& lp = this ->model_ .lp_ ;
3003+ const bool has_integrality = lp.integrality_ .size ();
3004+ if (info_.primal_solution_status != kSolutionStatusNone ) {
3005+ if (data.user_bound_scale ) {
3006+ for (HighsInt iCol = 0 ; iCol < lp.num_col_ ; iCol++) {
3007+ if (has_integrality && lp.integrality_ [iCol] != HighsVarType::kContinuous ) continue ;
3008+ this ->solution_ .col_value [iCol] *= bound_scale_value;
3009+ }
3010+ for (HighsInt iRow = 0 ; iRow < lp.num_row_ ; iRow++)
3011+ this ->solution_ .row_value [iRow] *= bound_scale_value;
30143012 }
3015- this->invalidateModelStatusSolutionAndInfo();
3016- this->invalidateSolverData();
3017- lp.user_cost_scale_ = options.user_cost_scale;
3018- lp.user_bound_scale_ = options.user_bound_scale;
30193013 }
3020- */
3021- return HighsStatus::kOk ;
3014+ if (info_.dual_solution_status != kSolutionStatusNone ) {
3015+ if (data.user_cost_scale ) {
3016+ for (HighsInt iCol = 0 ; iCol < lp.num_col_ ; iCol++)
3017+ this ->solution_ .col_dual [iCol] *= cost_scale_value;
3018+ for (HighsInt iRow = 0 ; iRow < lp.num_row_ ; iRow++)
3019+ this ->solution_ .row_dual [iRow] *= cost_scale_value;
3020+ }
3021+ }
3022+ if (!update_kkt) return return_status;
3023+ info_.objective_function_value *= (bound_scale_value*cost_scale_value);
3024+ getKktFailures (options_, model_, solution_, basis_, info_);
3025+ return return_status;
30223026}
30233027
30243028void HighsIllConditioning::clear () { this ->record .clear (); }
0 commit comments