Skip to content

Commit ea5c78c

Browse files
authored
Merge pull request #2291 from ERGO-Code/valgrind-scheduler
Reset global scheduler
2 parents ca9daad + 22f165c commit ea5c78c

35 files changed

+325
-41
lines changed

app/RunHighs.cpp

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,8 @@
99
* @brief HiGHS main
1010
*/
1111
#include "Highs.h"
12-
// #include "io/HighsIO.h"
1312
#include "HighsRuntimeOptions.h"
1413

15-
// uncomment if we will be shutting down task executor from exe
16-
// #include "parallel/HighsParallel.h"
17-
1814
int main(int argc, char** argv) {
1915
// Create the Highs instance.
2016
Highs highs;
@@ -31,10 +27,6 @@ int main(int argc, char** argv) {
3127
// When loading the options file, any messages are reported using
3228
// the default HighsLogOptions
3329

34-
// Replace command line options parsing library
35-
// cxxopts now Cpp17 with
36-
// CLI11 for Cpp11
37-
3830
CLI::App app{""};
3931
argv = app.ensure_utf8(argv);
4032

@@ -117,8 +109,9 @@ int main(int argc, char** argv) {
117109

118110
// highs.writeInfo("Info.md");
119111

120-
// Shut down task executor: optional and wip
121-
// HighsTaskExecutor::shutdown(true);
112+
// Shut down task executor for explicit release of memory.
113+
// Valgrind still reachable otherwise.
114+
highs.resetGlobalScheduler(true);
122115

123116
return (int)run_status;
124117
}

check/CMakeLists.txt

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,57 +28,57 @@ if ((NOT FAST_BUILD OR ALL_TESTS) AND NOT (BUILD_EXTRA_UNIT_ONLY))
2828

2929
# Make test executable
3030
set(TEST_SOURCES
31-
TestHighsVersion.cpp
3231
TestAlienBasis.cpp
33-
TestDualize.cpp
32+
TestBasis.cpp
33+
TestBasisSolves.cpp
3434
TestCallbacks.cpp
3535
TestCheckSolution.cpp
36+
TestCrossover.cpp
37+
TestDualize.cpp
3638
TestEkk.cpp
3739
TestFactor.cpp
38-
TestMain.cpp
39-
TestNames.cpp
40-
TestOptions.cpp
41-
TestIO.cpp
42-
TestSort.cpp
43-
TestSetup.cpp
4440
TestFilereader.cpp
45-
TestHighsGFkSolve.cpp
46-
TestInfo.cpp
47-
TestBasis.cpp
48-
TestBasisSolves.cpp
49-
TestCrossover.cpp
5041
TestHighsCDouble.cpp
42+
TestHighsGFkSolve.cpp
5143
TestHighsHash.cpp
44+
TestHighsHessian.cpp
5245
TestHighsIntegers.cpp
46+
TestHighsModel.cpp
5347
TestHighsParallel.cpp
5448
TestHighsRbTree.cpp
55-
TestHighsHessian.cpp
56-
TestHighsModel.cpp
5749
TestHighsSparseMatrix.cpp
50+
TestHighsVersion.cpp
5851
TestHSet.cpp
5952
TestICrash.cpp
6053
TestIis.cpp
54+
TestInfo.cpp
55+
TestIO.cpp
6156
TestIpm.cpp
6257
TestIpx.cpp
6358
TestLogging.cpp
6459
TestLPFileFormat.cpp
65-
TestLpValidation.cpp
6660
TestLpModification.cpp
6761
TestLpOrientation.cpp
62+
TestLpSolvers.cpp
63+
TestLpValidation.cpp
64+
TestMain.cpp
65+
TestMipSolver.cpp
6866
TestModelProperties.cpp
6967
TestMultiObjective.cpp
68+
TestNames.cpp
69+
TestOptions.cpp
7070
TestPdlp.cpp
7171
TestPresolve.cpp
7272
TestQpSolver.cpp
73-
TestRays.cpp
7473
TestRanging.cpp
74+
TestRays.cpp
7575
TestSemiVariables.cpp
76+
TestSetup.cpp
77+
TestSort.cpp
78+
TestSpecialLps.cpp
7679
TestThrow.cpp
7780
TestTspSolver.cpp
7881
TestUserScale.cpp
79-
TestSpecialLps.cpp
80-
TestLpSolvers.cpp
81-
TestMipSolver.cpp
8282
Avgas.cpp)
8383

8484
set(OPT_LEVEL_CHANGED OFF)

check/TestAlienBasis.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,8 @@ void testAlienBasis(const bool avgas, const HighsInt seed) {
606606
REQUIRE(highs.setBasis(basis) == HighsStatus::kOk);
607607
highs.run();
608608
}
609+
610+
highs.resetGlobalScheduler(true);
609611
}
610612

611613
TEST_CASE("AlienBasis-reuse-basis", "[highs_test_alien_basis]") {
@@ -671,6 +673,8 @@ TEST_CASE("AlienBasis-reuse-basis", "[highs_test_alien_basis]") {
671673
REQUIRE(highs.setBasis(basis) == HighsStatus::kOk);
672674
highs.run();
673675
if (dev_run) highs.writeSolution("", 1);
676+
677+
highs.resetGlobalScheduler(true);
674678
}
675679

676680
TEST_CASE("AlienBasis-singular-basis", "[highs_test_alien_basis]") {
@@ -708,4 +712,6 @@ TEST_CASE("AlienBasis-singular-basis", "[highs_test_alien_basis]") {
708712
basic_variables.resize(lp.num_row_);
709713
return_status = highs.getBasicVariables(basic_variables.data());
710714
REQUIRE(return_status == HighsStatus::kError);
715+
716+
highs.resetGlobalScheduler(true);
711717
}

check/TestBasis.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ TEST_CASE("Basis-file", "[highs_basis_file]") {
7373

7474
std::remove(basis_file.c_str());
7575
std::remove(invalid_basis_file.c_str());
76+
77+
highs.resetGlobalScheduler(true);
7678
}
7779

7880
TEST_CASE("Basis-data", "[highs_basis_data]") {
@@ -101,6 +103,8 @@ TEST_CASE("Basis-data", "[highs_basis_data]") {
101103

102104
testBasisRestart(highs, basis_file, false);
103105
testBasisReloadModel(highs, basis_file, false);
106+
107+
highs.resetGlobalScheduler(true);
104108
}
105109

106110
TEST_CASE("set-pathological-basis", "[highs_basis_data]") {
@@ -136,6 +140,8 @@ TEST_CASE("set-pathological-basis", "[highs_basis_data]") {
136140
highs.setBasis(basis);
137141
highs.run();
138142
REQUIRE(highs.getModelStatus() == HighsModelStatus::kUnbounded);
143+
144+
highs.resetGlobalScheduler(true);
139145
}
140146

141147
TEST_CASE("Basis-no-basic", "[highs_basis_data]") {
@@ -160,6 +166,8 @@ TEST_CASE("Basis-no-basic", "[highs_basis_data]") {
160166
if (dev_run) highs.writeSolution("", 1);
161167
REQUIRE(highs.getInfo().objective_function_value == -0.5);
162168
REQUIRE(highs.getModelStatus() == HighsModelStatus::kOptimal);
169+
170+
highs.resetGlobalScheduler(true);
163171
}
164172

165173
TEST_CASE("Basis-singular", "[highs_basis_data]") {

check/TestBasisSolves.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,8 @@ TEST_CASE("Basis-solves", "[highs_basis_solves]") {
563563
// Solve
564564
highs.run();
565565
REQUIRE(highs.getInfo().simplex_iteration_count == 0);
566+
567+
highs.resetGlobalScheduler(true);
566568
}
567569

568570
TEST_CASE("Kappa", "[highs_basis_solves]") {
@@ -610,4 +612,6 @@ TEST_CASE("Kappa", "[highs_basis_solves]") {
610612
highs.run();
611613
REQUIRE(highs.getKappa(kappa) == HighsStatus::kError);
612614
}
615+
616+
highs.resetGlobalScheduler(true);
613617
}

check/TestCallbacks.cpp

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ std::function<void(int, const std::string&, const HighsCallbackDataOut*,
231231
data_out->objective_function_value, message.c_str());
232232
};
233233

234-
TEST_CASE("my-callback-logging", "[highs-callback]") {
234+
TEST_CASE("my-callback-logging", "[highs_callback]") {
235235
bool output_flag = true; // Still runs quietly
236236
bool log_to_console = false;
237237
HighsInt log_dev_level = kHighsLogDevLevelInfo;
@@ -281,7 +281,7 @@ TEST_CASE("my-callback-logging", "[highs-callback]") {
281281
}
282282
}
283283

284-
TEST_CASE("highs-callback-logging", "[highs-callback]") {
284+
TEST_CASE("highs-callback-logging", "[highs_callback]") {
285285
// Uses userInterruptCallback to start logging lines with
286286
// "userInterruptCallback(kUserCallbackData): " since
287287
// Highs::setCallback has second argument p_user_callback_data
@@ -295,9 +295,11 @@ TEST_CASE("highs-callback-logging", "[highs-callback]") {
295295
highs.startCallback(kCallbackLogging);
296296
highs.readModel(filename);
297297
highs.run();
298+
299+
highs.resetGlobalScheduler(true);
298300
}
299301

300-
TEST_CASE("highs-callback-solution-basis-logging", "[highs-callback]") {
302+
TEST_CASE("highs-callback-solution-basis-logging", "[highs_callback]") {
301303
std::string filename = std::string(HIGHS_DIR) + "/check/instances/avgas.mps";
302304
int user_callback_data = kUserCallbackData;
303305
void* p_user_callback_data =
@@ -310,9 +312,11 @@ TEST_CASE("highs-callback-solution-basis-logging", "[highs-callback]") {
310312
highs.startCallback(kCallbackLogging);
311313
if (dev_run) highs.writeSolution("", kSolutionStylePretty);
312314
if (dev_run) highs.writeBasis("");
315+
316+
highs.resetGlobalScheduler(true);
313317
}
314318

315-
TEST_CASE("highs-callback-simplex-interrupt", "[highs-callback]") {
319+
TEST_CASE("highs-callback-simplex-interrupt", "[highs_callback]") {
316320
std::string filename =
317321
std::string(HIGHS_DIR) + "/check/instances/adlittle.mps";
318322
Highs highs;
@@ -325,9 +329,11 @@ TEST_CASE("highs-callback-simplex-interrupt", "[highs-callback]") {
325329
REQUIRE(highs.getModelStatus() == HighsModelStatus::kInterrupt);
326330
REQUIRE(highs.getInfo().simplex_iteration_count >
327331
adlittle_simplex_iteration_limit);
332+
333+
highs.resetGlobalScheduler(true);
328334
}
329335

330-
TEST_CASE("highs-callback-ipm-interrupt", "[highs-callback]") {
336+
TEST_CASE("highs-callback-ipm-interrupt", "[highs_callback]") {
331337
std::string filename =
332338
std::string(HIGHS_DIR) + "/check/instances/adlittle.mps";
333339
Highs highs;
@@ -340,9 +346,11 @@ TEST_CASE("highs-callback-ipm-interrupt", "[highs-callback]") {
340346
REQUIRE(status == HighsStatus::kWarning);
341347
REQUIRE(highs.getModelStatus() == HighsModelStatus::kInterrupt);
342348
REQUIRE(highs.getInfo().ipm_iteration_count > adlittle_ipm_iteration_limit);
349+
350+
highs.resetGlobalScheduler(true);
343351
}
344352

345-
TEST_CASE("highs-callback-mip-interrupt", "[highs-callback]") {
353+
TEST_CASE("highs-callback-mip-interrupt", "[highs_callback]") {
346354
std::string filename = std::string(HIGHS_DIR) + "/check/instances/egout.mps";
347355
Highs highs;
348356
highs.setOptionValue("output_flag", dev_run);
@@ -354,9 +362,11 @@ TEST_CASE("highs-callback-mip-interrupt", "[highs-callback]") {
354362
REQUIRE(status == HighsStatus::kWarning);
355363
REQUIRE(highs.getModelStatus() == HighsModelStatus::kInterrupt);
356364
REQUIRE(highs.getInfo().objective_function_value > egout_optimal_objective);
365+
366+
highs.resetGlobalScheduler(true);
357367
}
358368

359-
TEST_CASE("highs-callback-mip-improving", "[highs-callback]") {
369+
TEST_CASE("highs-callback-mip-improving", "[highs_callback]") {
360370
std::string filename = std::string(HIGHS_DIR) + "/check/instances/egout.mps";
361371
Highs highs;
362372
highs.setOptionValue("output_flag", dev_run);
@@ -367,9 +377,11 @@ TEST_CASE("highs-callback-mip-improving", "[highs-callback]") {
367377
highs.startCallback(kCallbackMipImprovingSolution);
368378
highs.readModel(filename);
369379
highs.run();
380+
381+
highs.resetGlobalScheduler(true);
370382
}
371383

372-
TEST_CASE("highs-callback-mip-data", "[highs-callback]") {
384+
TEST_CASE("highs-callback-mip-data", "[highs_callback]") {
373385
std::string filename = std::string(HIGHS_DIR) + "/check/instances/egout.mps";
374386
Highs highs;
375387
highs.setOptionValue("output_flag", dev_run);
@@ -379,9 +391,11 @@ TEST_CASE("highs-callback-mip-data", "[highs-callback]") {
379391
highs.startCallback(kCallbackMipLogging);
380392
highs.readModel(filename);
381393
highs.run();
394+
395+
highs.resetGlobalScheduler(true);
382396
}
383397

384-
TEST_CASE("highs-callback-mip-solution", "[highs-callback]") {
398+
TEST_CASE("highs-callback-mip-solution", "[highs_callback]") {
385399
std::string filename = std::string(HIGHS_DIR) + "/check/instances/egout.mps";
386400
Highs highs;
387401
highs.setOptionValue("output_flag", dev_run);
@@ -399,19 +413,23 @@ TEST_CASE("highs-callback-mip-solution", "[highs-callback]") {
399413
highs.setCallback(userMipSolutionCallback, p_user_callback_data);
400414
highs.startCallback(kCallbackMipSolution);
401415
highs.run();
416+
417+
highs.resetGlobalScheduler(true);
402418
}
403419

404-
TEST_CASE("highs-callback-mip-cut-pool", "[highs-callback]") {
420+
TEST_CASE("highs-callback-mip-cut-pool", "[highs_callback]") {
405421
std::string filename = std::string(HIGHS_DIR) + "/check/instances/flugpl.mps";
406422
Highs highs;
407423
highs.setOptionValue("output_flag", dev_run);
408424
highs.readModel(filename);
409425
highs.setCallback(userMipCutPoolCallback);
410426
highs.startCallback(kCallbackMipGetCutPool);
411427
highs.run();
428+
429+
highs.resetGlobalScheduler(true);
412430
}
413431

414-
TEST_CASE("highs-callback-mip-user-solution", "[highs-callback]") {
432+
TEST_CASE("highs-callback-mip-user-solution", "[highs_callback]") {
415433
// const std::vector<std::string> model = {"rgn", "flugpl", "gt2", "egout",
416434
// "bell5", "lseu", "sp150x300d"};//, "p0548", "dcmulti"}; const
417435
// std::vector<HighsInt> require_origin = {0, 1, 2, 3, 4, 5, 6};
@@ -451,4 +469,6 @@ TEST_CASE("highs-callback-mip-user-solution", "[highs-callback]") {
451469
std::max(1.0, std::fabs(objective_function_value0));
452470
REQUIRE(objective_diff < 1e-12);
453471
}
472+
473+
highs.resetGlobalScheduler(true);
454474
}

check/TestCheckSolution.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,8 @@ TEST_CASE("check-set-mip-solution", "[highs_check_solution]") {
288288
}
289289
assert(other_tests);
290290
std::remove(solution_file.c_str());
291+
292+
highs.resetGlobalScheduler(true);
291293
}
292294

293295
TEST_CASE("set-pathological-solution", "[highs_check_solution]") {
@@ -314,6 +316,8 @@ TEST_CASE("set-pathological-solution", "[highs_check_solution]") {
314316
highs.setSolution(solution);
315317
highs.run();
316318
REQUIRE(highs.getModelStatus() == HighsModelStatus::kUnbounded);
319+
320+
highs.resetGlobalScheduler(true);
317321
}
318322

319323
TEST_CASE("check-set-lp-solution", "[highs_check_solution]") {
@@ -357,6 +361,8 @@ TEST_CASE("check-set-rowwise-lp-solution", "[highs_check_solution]") {
357361
highs.run();
358362
double objective2 = highs.getInfo().objective_function_value;
359363
REQUIRE(fabs(objective1 - objective2) / max(1.0, objective1) < 1e-5);
364+
365+
highs.resetGlobalScheduler(true);
360366
}
361367

362368
TEST_CASE("check-set-mip-solution-extra-row", "[highs_check_solution]") {
@@ -387,6 +393,8 @@ TEST_CASE("check-set-mip-solution-extra-row", "[highs_check_solution]") {
387393
highs.run();
388394
if (dev_run) highs.writeSolution("", 1);
389395
std::remove(solution_file_name.c_str());
396+
397+
highs.resetGlobalScheduler(true);
390398
}
391399

392400
TEST_CASE("check-set-illegal-solution", "[highs_check_solution]") {
@@ -447,6 +455,8 @@ TEST_CASE("read-miplib-solution", "[highs_check_solution]") {
447455
REQUIRE(h.readSolution(miplib_sol_file) == HighsStatus::kOk);
448456
REQUIRE(h.run() == HighsStatus::kOk);
449457
std::remove(miplib_sol_file.c_str());
458+
459+
h.resetGlobalScheduler(true);
450460
}
451461

452462
void runWriteReadCheckSolution(Highs& highs, const std::string& test_name,
@@ -499,6 +509,8 @@ void runWriteReadCheckSolution(Highs& highs, const std::string& test_name,
499509
REQUIRE(status == require_model_status);
500510

501511
std::remove(solution_file.c_str());
512+
513+
highs.resetGlobalScheduler(true);
502514
}
503515

504516
void runSetLpSolution(const std::string model) {
@@ -566,4 +578,6 @@ void runSetLpSolution(const std::string model) {
566578
highs.clear();
567579

568580
std::remove(solution_file.c_str());
581+
582+
highs.resetGlobalScheduler(true);
569583
}

0 commit comments

Comments
 (0)