@@ -16,24 +16,61 @@ void checkLpScaling(const HighsInt user_bound_scale,
1616 const HighsInt user_cost_scale, const HighsLp& unscaled_lp,
1717 const HighsLp& scaled_lp);
1818
19+ bool doubleEqual0 (const double v0, const double v1) {
20+ return std::fabs (v0 - v1)/std::max (1.0 , std::fabs (v0)) < 1e-12 ;
21+ }
22+
1923TEST_CASE (" user-cost-scale-after-run" , " [highs_user_scale]" ) {
20- std::string filename =
21- std::string (HIGHS_DIR) + " /check/instances/adlittle.mps" ;
24+ std::string model = " avgas" ;
2225 Highs highs;
2326 const HighsInfo& info = highs.getInfo ();
2427 highs.setOptionValue (" output_flag" , dev_run);
2528 for (HighsInt k = 0 ; k < 2 ; k++) {
29+ std::string filename =
30+ std::string (HIGHS_DIR) + " /check/instances/" + model + " .mps" ;
2631 highs.readModel (filename);
27- highs.run ();
28- HighsInfo unscaled_info = info;
29- HighsSolution unscaled_solution = highs.getSolution ();
32+ highs.writeModel (" " );
33+ double col_cost_1 = highs.getLp ().col_cost_ [1 ]; // kInteger for flugpl
34+ double col_cost_2 = highs.getLp ().col_cost_ [2 ]; // kContinuous for flugpl
35+ double col_upper_1 = highs.getLp ().col_upper_ [1 ];
36+ double col_upper_2 = highs.getLp ().col_upper_ [2 ];
37+ double row_upper_0 = highs.getLp ().row_upper_ [0 ];
38+ double matrix_value_1 = highs.getLp ().a_matrix_ .value_ [highs.getLp ().a_matrix_ .start_ [1 ]];
39+ double matrix_value_2 = highs.getLp ().a_matrix_ .value_ [highs.getLp ().a_matrix_ .start_ [2 ]];
3040 HighsLp unscaled_lp = highs.getLp ();
3141
32- HighsInt user_bound_scale = 10 ;
42+ highs.run ();
43+ double unscaled_objective = highs.getInfo ().objective_function_value ;
44+
45+ HighsInt user_bound_scale = 1 ;// 8;
46+ double user_bound_scale_value = std::pow (2 , user_bound_scale);
3347 REQUIRE (highs.setOptionValue (" user_bound_scale" , user_bound_scale) == HighsStatus::kOk );
48+ if (k == 0 ) {
49+ REQUIRE (highs.getLp ().col_cost_ [1 ] == col_cost_1);
50+ REQUIRE (highs.getLp ().col_upper_ [1 ] == user_bound_scale_value*col_upper_1);
51+ } else {
52+ REQUIRE (highs.getLp ().col_cost_ [1 ] == user_bound_scale_value*col_cost_1);
53+ REQUIRE (highs.getLp ().col_upper_ [1 ] == col_upper_1);
54+ }
55+ REQUIRE (highs.getLp ().col_upper_ [2 ] == user_bound_scale_value*col_upper_2);
56+ REQUIRE (highs.getLp ().row_upper_ [0 ] == row_upper_0);
3457
35- HighsInt user_cost_scale = 30 ;
58+ HighsInt user_cost_scale = 4 ;
59+ double user_cost_scale_value = std::pow (2 , user_cost_scale);
3660 REQUIRE (highs.setOptionValue (" user_cost_scale" , user_cost_scale) == HighsStatus::kOk );
61+ if (k == 0 ) {
62+ REQUIRE (highs.getLp ().col_cost_ [1 ] == user_cost_scale_value*col_cost_1);
63+ } else {
64+ REQUIRE (highs.getLp ().col_cost_ [1 ] == user_cost_scale_value*user_bound_scale_value*col_cost_1);
65+ }
66+ REQUIRE (highs.getLp ().col_cost_ [2 ] == user_cost_scale_value*col_cost_2);
67+ if (k == 0 ) {
68+ REQUIRE (highs.getLp ().col_upper_ [1 ] == user_bound_scale_value*col_upper_1);
69+ } else {
70+ REQUIRE (highs.getLp ().col_upper_ [1 ] == col_upper_1);
71+ }
72+ REQUIRE (highs.getLp ().col_upper_ [2 ] == user_bound_scale_value*col_upper_2);
73+ REQUIRE (highs.getLp ().row_upper_ [0 ] == user_bound_scale_value*row_upper_0);
3774
3875 HighsLp scaled_lp = highs.getLp ();
3976 checkLpScaling (user_bound_scale, user_cost_scale, unscaled_lp, scaled_lp);
@@ -48,8 +85,12 @@ TEST_CASE("user-cost-scale-after-run", "[highs_user_scale]") {
4885 REQUIRE (info.max_dual_infeasibility == kHighsIllegalInfeasibilityMeasure );
4986 REQUIRE (info.sum_dual_infeasibilities == kHighsIllegalInfeasibilityMeasure );
5087
51- filename =
52- std::string (HIGHS_DIR) + " /check/instances/flugpl.mps" ;
88+ highs.run ();
89+ REQUIRE (highs.getModelStatus () == HighsModelStatus::kOptimal );
90+ REQUIRE (doubleEqual0 (highs.getInfo ().objective_function_value ,
91+ user_bound_scale_value*user_cost_scale_value*unscaled_objective));
92+
93+ model = " flugpl" ;
5394 REQUIRE (highs.setOptionValue (" user_bound_scale" , 0 ) == HighsStatus::kOk );
5495 REQUIRE (highs.setOptionValue (" user_cost_scale" , 0 ) == HighsStatus::kOk );
5596 }
@@ -69,11 +110,9 @@ TEST_CASE("user-cost-scale-after-load", "[highs_user_scale]") {
69110 HighsLp unscaled_lp = highs.getLp ();
70111
71112 HighsInt user_bound_scale = 10 ;
72- double user_bound_scale_value = std::pow (2 , user_bound_scale);
73113 REQUIRE (highs.setOptionValue (" user_bound_scale" , user_bound_scale) == HighsStatus::kOk );
74114
75115 HighsInt user_cost_scale = 30 ;
76- double user_cost_scale_value = std::pow (2 , user_cost_scale);
77116 REQUIRE (highs.setOptionValue (" user_cost_scale" , user_cost_scale) == HighsStatus::kOk );
78117
79118 REQUIRE (highs.readModel (filename) == HighsStatus::kOk );
@@ -85,6 +124,7 @@ TEST_CASE("user-cost-scale-after-load", "[highs_user_scale]") {
85124 std::string (HIGHS_DIR) + " /check/instances/flugpl.mps" ;
86125 REQUIRE (highs.setOptionValue (" user_bound_scale" , 0 ) == HighsStatus::kOk );
87126 REQUIRE (highs.setOptionValue (" user_cost_scale" , 0 ) == HighsStatus::kOk );
127+
88128 }
89129
90130 highs.resetGlobalScheduler (true );
0 commit comments