77const bool dev_run = true ; // false;
88const double inf = kHighsInf ;
99
10- void checkModelScaling (const HighsInt user_bound_scale,
11- const HighsInt user_cost_scale,
12- const HighsModel& unscaled_model,
13- const HighsModel& scaled_model);
14-
15- void checkLpScaling (const HighsInt user_bound_scale,
16- const HighsInt user_cost_scale, const HighsLp& unscaled_lp,
17- const HighsLp& scaled_lp);
18-
1910bool doubleEqual0 (const double v0, const double v1) {
20- return std::fabs (v0 - v1)/std::max (1.0 , std::fabs (v0)) < 1e-12 ;
11+ double rel_difference = std::fabs (v0 - v1) / std::max (1.0 , std::fabs (v0));
12+ bool ok = rel_difference < 1e-12 ;
13+ if (dev_run && !ok)
14+ printf (" UserScaleDoubleEqual: %g and %g have relative difference = %g\n " ,
15+ v0, v1, rel_difference);
16+ return ok;
2117}
2218
2319TEST_CASE (" user-scale-after-run" , " [highs_user_scale]" ) {
24- const std::string mip_model = " flugpl" ;// "rgn";//
20+ const std::string mip_model = " flugpl" ; // "rgn";//
2521 std::string model = " avgas" ;
2622 Highs highs;
2723 const HighsInfo& info = highs.getInfo ();
2824 highs.setOptionValue (" output_flag" , dev_run);
29- // REQUIRE(highs.setOptionValue("presolve", kHighsOffString) == HighsStatus::kOk);
30- HighsInt num_k = 1 ;
25+ // REQUIRE(highs.setOptionValue("presolve", kHighsOffString) ==
26+ // HighsStatus::kOk);
27+ HighsInt num_k = 2 ;
3128 if (num_k == 1 ) model = mip_model;
3229 for (HighsInt k = 0 ; k < num_k; k++) {
3330 std::string filename =
34- std::string (HIGHS_DIR) + " /check/instances/" + model + " .mps" ;
31+ std::string (HIGHS_DIR) + " /check/instances/" + model + " .mps" ;
3532 highs.readModel (filename);
3633 HighsLp unscaled_lp = highs.getLp ();
3734 const bool is_lp = !unscaled_lp.isMip ();
38- highs.writeModel (" unscaled.mps" );
35+ // highs.writeModel("unscaled.mps");
3936
4037 highs.run ();
4138 double unscaled_objective = highs.getInfo ().objective_function_value ;
4239
4340 HighsInt user_bound_scale = 1 ;
4441 double user_bound_scale_value = std::pow (2 , user_bound_scale);
45-
46- REQUIRE (highs.setOptionValue (" user_bound_scale" , user_bound_scale) == HighsStatus::kOk );
47-
48- HighsLp bound_scaled_lp = highs.getLp ();
49- checkLpScaling (user_bound_scale, 0 , unscaled_lp, bound_scaled_lp);
42+ REQUIRE (highs.setOptionValue (" user_bound_scale" , user_bound_scale) ==
43+ HighsStatus::kOk );
5044
5145 HighsInt user_cost_scale = 4 ;
5246 double user_cost_scale_value = std::pow (2 , user_cost_scale);
53- REQUIRE (highs.setOptionValue (" user_cost_scale" , user_cost_scale) == HighsStatus::kOk );
54-
55- HighsLp scaled_lp = highs.getLp ();
56- checkLpScaling (user_bound_scale, user_cost_scale, unscaled_lp, scaled_lp);
57-
58- REQUIRE (highs.getModelStatus () == HighsModelStatus::kNotset );
59- REQUIRE (info.primal_solution_status == kSolutionStatusNone );
60- REQUIRE (info.dual_solution_status == kSolutionStatusNone );
61- REQUIRE (info.num_primal_infeasibilities == kHighsIllegalInfeasibilityCount );
62- REQUIRE (info.max_primal_infeasibility == kHighsIllegalInfeasibilityMeasure );
63- REQUIRE (info.sum_primal_infeasibilities == kHighsIllegalInfeasibilityMeasure );
64- REQUIRE (info.num_dual_infeasibilities == kHighsIllegalInfeasibilityCount );
65- REQUIRE (info.max_dual_infeasibility == kHighsIllegalInfeasibilityMeasure );
66- REQUIRE (info.sum_dual_infeasibilities == kHighsIllegalInfeasibilityMeasure );
67-
68- highs.writeModel (" scaled0.mps" );
69- highs.passModel (scaled_lp);
47+ REQUIRE (highs.setOptionValue (" user_cost_scale" , user_cost_scale) ==
48+ HighsStatus::kOk );
49+
7050 highs.run ();
71-
51+
7252 REQUIRE (highs.getModelStatus () == HighsModelStatus::kOptimal );
7353 REQUIRE (doubleEqual0 (highs.getInfo ().objective_function_value ,
74- user_bound_scale_value*user_cost_scale_value* unscaled_objective));
54+ unscaled_objective));
7555
7656 model = mip_model;
7757 REQUIRE (highs.setOptionValue (" user_bound_scale" , 0 ) == HighsStatus::kOk );
@@ -81,38 +61,6 @@ TEST_CASE("user-scale-after-run", "[highs_user_scale]") {
8161 highs.resetGlobalScheduler (true );
8262}
8363
84- TEST_CASE (" user-scale-after-load" , " [highs_user_scale]" ) {
85- std::string filename =
86- std::string (HIGHS_DIR) + " /check/instances/adlittle.mps" ;
87- Highs highs;
88- const HighsInfo& info = highs.getInfo ();
89- highs.setOptionValue (" output_flag" , dev_run);
90-
91- for (HighsInt k = 0 ; k < 2 ; k++) {
92- highs.readModel (filename);
93- HighsLp unscaled_lp = highs.getLp ();
94-
95- HighsInt user_bound_scale = 10 ;
96- REQUIRE (highs.setOptionValue (" user_bound_scale" , user_bound_scale) == HighsStatus::kOk );
97-
98- HighsInt user_cost_scale = 30 ;
99- REQUIRE (highs.setOptionValue (" user_cost_scale" , user_cost_scale) == HighsStatus::kOk );
100-
101- REQUIRE (highs.readModel (filename) == HighsStatus::kOk );
102- HighsLp scaled_lp = highs.getLp ();
103-
104- checkLpScaling (user_bound_scale, user_cost_scale, unscaled_lp, scaled_lp);
105-
106- filename =
107- std::string (HIGHS_DIR) + " /check/instances/flugpl.mps" ;
108- REQUIRE (highs.setOptionValue (" user_bound_scale" , 0 ) == HighsStatus::kOk );
109- REQUIRE (highs.setOptionValue (" user_cost_scale" , 0 ) == HighsStatus::kOk );
110-
111- }
112-
113- highs.resetGlobalScheduler (true );
114- }
115-
11664TEST_CASE (" user-small-cost-scale" , " [highs_user_scale]" ) {
11765 Highs highs;
11866 const HighsInfo& info = highs.getInfo ();
@@ -151,53 +99,3 @@ TEST_CASE("user-small-cost-scale", "[highs_user_scale]") {
15199
152100 highs.resetGlobalScheduler (true );
153101}
154-
155- void checkModelScaling (const HighsInt user_bound_scale,
156- const HighsInt user_cost_scale,
157- const HighsModel& unscaled_model,
158- const HighsModel& scaled_model) {
159- checkLpScaling (user_bound_scale, user_cost_scale, unscaled_model.lp_ ,
160- scaled_model.lp_ );
161- }
162-
163- void checkLpScaling (const HighsInt user_bound_scale,
164- const HighsInt user_cost_scale, const HighsLp& unscaled_lp,
165- const HighsLp& scaled_lp) {
166- const double user_bound_scale_value = std::pow (2 , user_bound_scale);
167- const double user_cost_scale_value = std::pow (2 , user_cost_scale);
168- REQUIRE (unscaled_lp.num_col_ == scaled_lp.num_col_ );
169- REQUIRE (unscaled_lp.num_row_ == scaled_lp.num_row_ );
170- const bool has_integrality = scaled_lp.integrality_ .size () > 0 ;
171- const HighsSparseMatrix& unscaled_matrix = unscaled_lp.a_matrix_ ;
172- REQUIRE (unscaled_matrix.isColwise ());
173- for (HighsInt iCol = 0 ; iCol < unscaled_lp.num_col_ ; iCol++) {
174- bool continuous = !has_integrality || scaled_lp.integrality_ [iCol] == HighsVarType::kContinuous ;
175- double value = unscaled_lp.col_cost_ [iCol] * user_cost_scale_value;
176- if (!continuous) value *= user_bound_scale_value;
177- REQUIRE (scaled_lp.col_cost_ [iCol] == value);
178- if (unscaled_lp.col_lower_ [iCol] > -inf) {
179- value = unscaled_lp.col_lower_ [iCol];
180- if (continuous) value *= user_bound_scale_value;
181- REQUIRE (scaled_lp.col_lower_ [iCol] == value);
182- }
183- if (unscaled_lp.col_upper_ [iCol] < inf) {
184- value = unscaled_lp.col_upper_ [iCol];
185- if (continuous) value *= user_bound_scale_value;
186- REQUIRE (scaled_lp.col_upper_ [iCol] == value);
187- }
188- for (HighsInt iEl = unscaled_matrix.start_ [iCol]; iEl < unscaled_matrix.start_ [iCol+1 ]; iEl++) {
189- value = unscaled_matrix.value_ [iEl];
190- if (!continuous) value *= user_bound_scale_value;
191- REQUIRE (scaled_lp.a_matrix_ .value_ [iEl] == value);
192- }
193- }
194- for (HighsInt iRow = 0 ; iRow < unscaled_lp.num_row_ ; iRow++) {
195- if (unscaled_lp.row_lower_ [iRow] > -inf)
196- REQUIRE (scaled_lp.row_lower_ [iRow] ==
197- unscaled_lp.row_lower_ [iRow] * user_bound_scale_value);
198- if (unscaled_lp.row_upper_ [iRow] < inf)
199- REQUIRE (scaled_lp.row_upper_ [iRow] ==
200- unscaled_lp.row_upper_ [iRow] * user_bound_scale_value);
201- }
202- }
203-
0 commit comments