1+ #include < cmath>
2+ #include < iostream>
3+ #include < vector>
4+
15#include " HCheckConfig.h"
26#include " Highs.h"
37#include " catch.hpp"
711#include " lp_data/HighsCallback.h"
812#include " parallel/HighsParallel.h"
913
10- // Example for using HiPO from its C++ interface. The program solves the Netlib
11- // problem afiro.
12-
13- // #include <unistd.h>
14-
15- #include < cmath>
16- #include < iostream>
17- #include < vector>
18-
1914const bool dev_run = false ;
2015
21- TEST_CASE (" test-hipo-afiro" , " [highs_hipo]" ) {
22- // Test that hipo runs and finds correct solution for afiro
23-
24- std::string model = " afiro.mps" ;
25- const double expected_obj = -464.753 ;
26-
27- Highs highs;
16+ void runHipoTest (Highs& highs, const std::string& model,
17+ const double expected_obj) {
2818 highs.setOptionValue (" output_flag" , dev_run);
2919 highs.setOptionValue (" solver" , kHipoString );
3020 highs.setOptionValue (" timeless_log" , kHighsOnString );
@@ -36,46 +26,34 @@ TEST_CASE("test-hipo-afiro", "[highs_hipo]") {
3626 REQUIRE (status == HighsStatus::kOk );
3727
3828 const double actual_obj = highs.getObjectiveValue ();
39- REQUIRE (std::abs (actual_obj - expected_obj) < 0.001 );
29+ REQUIRE (std::abs (actual_obj - expected_obj) / std::abs (expected_obj) < 1e-4 );
30+ }
4031
32+ TEST_CASE (" test-hipo-afiro" , " [highs_hipo]" ) {
33+ Highs highs;
34+ runHipoTest (highs, " afiro.mps" , -464.753 );
4135 highs.resetGlobalScheduler (true );
4236}
4337
4438TEST_CASE (" test-hipo-deterministic" , " [highs_hipo]" ) {
4539 // Test that hipo finds the exact same solution if run twice
4640
4741 std::string model = " 80bau3b.mps" ;
48- std::string filename = std::string (HIGHS_DIR) + " /check/instances/ " + model ;
42+ const double expected_obj = 9.8722e5 ;
4943
5044 HighsInt iter_1, iter_2;
5145 HighsSolution solution_1, solution_2;
5246
53- {
54- Highs highs;
55- highs.setOptionValue (" output_flag" , dev_run);
56- highs.setOptionValue (kSolverString , kHipoString );
57- highs.setOptionValue (kParallelString , kHighsOnString );
58- highs.setOptionValue (kRunCrossoverString , kHighsOffString );
59- highs.readModel (filename);
60- HighsStatus status = highs.run ();
61- REQUIRE (status == HighsStatus::kOk );
62- solution_1 = highs.getSolution ();
63- iter_1 = highs.getInfo ().ipm_iteration_count ;
64- highs.resetGlobalScheduler (true );
65- }
66- {
67- Highs highs;
68- highs.setOptionValue (" output_flag" , dev_run);
69- highs.setOptionValue (kSolverString , kHipoString );
70- highs.setOptionValue (kParallelString , kHighsOnString );
71- highs.setOptionValue (kRunCrossoverString , kHighsOffString );
72- highs.readModel (filename);
73- HighsStatus status = highs.run ();
74- REQUIRE (status == HighsStatus::kOk );
75- solution_2 = highs.getSolution ();
76- iter_2 = highs.getInfo ().ipm_iteration_count ;
77- highs.resetGlobalScheduler (true );
78- }
47+ Highs highs;
48+ highs.setOptionValue (kRunCrossoverString , kHighsOffString );
49+
50+ runHipoTest (highs, model, expected_obj);
51+ solution_1 = highs.getSolution ();
52+ iter_1 = highs.getInfo ().ipm_iteration_count ;
53+
54+ runHipoTest (highs, model, expected_obj);
55+ solution_2 = highs.getSolution ();
56+ iter_2 = highs.getInfo ().ipm_iteration_count ;
7957
8058 REQUIRE (iter_1 == iter_2);
8159 REQUIRE (solution_1.value_valid == solution_2.value_valid );
@@ -91,48 +69,27 @@ TEST_CASE("test-hipo-orderings", "[highs_hipo]") {
9169
9270 std::string model = " adlittle.mps" ;
9371 const double expected_obj = 2.2549e5 ;
94-
9572 Highs highs;
96- highs.setOptionValue (" output_flag" , dev_run);
97- highs.setOptionValue (" solver" , kHipoString );
98- highs.setOptionValue (" timeless_log" , kHighsOnString );
99-
100- std::string filename = std::string (HIGHS_DIR) + " /check/instances/" + model;
101- highs.readModel (filename);
10273
10374 // metis
104- {
105- highs.setOptionValue (kHipoOrderingString , kHipoMetisString );
106- HighsStatus status = highs.run ();
107- REQUIRE (status == HighsStatus::kOk );
108-
109- const double actual_obj = highs.getObjectiveValue ();
110-
111- REQUIRE (std::abs (actual_obj - expected_obj) / std::abs (expected_obj) <
112- 1e-4 );
113- }
75+ highs.setOptionValue (kHipoOrderingString , kHipoMetisString );
76+ runHipoTest (highs, model, expected_obj);
11477
11578 // amd
116- {
117- highs.setOptionValue (kHipoOrderingString , kHipoAmdString );
118- HighsStatus status = highs.run ();
119- REQUIRE (status == HighsStatus::kOk );
120-
121- const double actual_obj = highs.getObjectiveValue ();
122- REQUIRE (std::abs (actual_obj - expected_obj) / std::abs (expected_obj) <
123- 1e-4 );
124- }
79+ highs.setOptionValue (kHipoOrderingString , kHipoAmdString );
80+ runHipoTest (highs, model, expected_obj);
12581
12682 // rcm
127- {
128- highs.setOptionValue (kHipoOrderingString , kHipoRcmString );
129- HighsStatus status = highs.run ();
130- REQUIRE (status == HighsStatus::kOk );
83+ highs.setOptionValue (kHipoOrderingString , kHipoRcmString );
84+ runHipoTest (highs, model, expected_obj);
13185
132- const double actual_obj = highs.getObjectiveValue ();
133- REQUIRE (std::abs (actual_obj - expected_obj) / std::abs (expected_obj) <
134- 1e-4 );
135- }
86+ highs.resetGlobalScheduler (true );
87+ }
13688
89+ TEST_CASE (" test-hipo-qp" , " [highs_hipo]" ) {
90+ Highs highs;
91+ runHipoTest (highs, " qptestnw.lp" , -6.4500 );
92+ runHipoTest (highs, " qjh.lp" , -5.2500 );
93+ runHipoTest (highs, " primal1.mps" , -3.501296e-2 );
13794 highs.resetGlobalScheduler (true );
13895}
0 commit comments