Skip to content

Commit ee68c0e

Browse files
authored
Merge pull request #2854 from ERGO-Code/hipo-qp
Hipo QP solver
2 parents 149b89b + 0355bdb commit ee68c0e

30 files changed

+2045
-1375
lines changed

check/TestHipo.cpp

Lines changed: 35 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
#include <cmath>
2+
#include <iostream>
3+
#include <vector>
4+
15
#include "HCheckConfig.h"
26
#include "Highs.h"
37
#include "catch.hpp"
@@ -7,24 +11,10 @@
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-
1914
const 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

4438
TEST_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

Comments
 (0)