| 499 | } |
| 500 | |
| 501 | static void runMipUserSolutionTest( |
| 502 | HighsCallbackFunctionType callback_function) { |
| 503 | const std::vector<std::string> model = {"p0548", "flugpl", "gt2", "egout", |
| 504 | "sp150x300d"}; |
| 505 | const std::vector<HighsInt> require_origin = {0, 1, 2, 3, 4}; //, 4, 5, 6}; |
| 506 | assert(model.size() == require_origin.size()); |
| 507 | Highs highs; |
| 508 | highs.setOptionValue("output_flag", dev_run); |
| 509 | highs.setOptionValue("mip_rel_gap", 0); |
| 510 | HighsInt from_model = 0; |
| 511 | HighsInt to_model = HighsInt(model.size()); |
| 512 | for (HighsInt iModel = from_model; iModel < to_model; iModel++) { |
| 513 | const std::string filename = |
| 514 | std::string(HIGHS_DIR) + "/check/instances/" + model[iModel] + ".mps"; |
| 515 | highs.readModel(filename); |
| 516 | highs.run(); |
| 517 | std::vector<double> optimal_solution = highs.getSolution().col_value; |
| 518 | double objective_function_value0 = highs.getInfo().objective_function_value; |
| 519 | highs.clearSolver(); |
| 520 | |
| 521 | UserMipSolution user_callback_data; |
| 522 | user_callback_data.optimal_objective_value = objective_function_value0; |
| 523 | user_callback_data.optimal_solution = optimal_solution; |
| 524 | user_callback_data.require_external_solution_query_origin = |
| 525 | require_origin[iModel]; |
| 526 | void* p_user_callback_data = (void*)(&user_callback_data); |
| 527 | |
| 528 | highs.setCallback(callback_function, p_user_callback_data); |
| 529 | highs.startCallback(kCallbackMipUserSolution); |
| 530 | highs.run(); |
| 531 | highs.stopCallback(kCallbackMipUserSolution); |
| 532 | double objective_function_value1 = highs.getInfo().objective_function_value; |
| 533 | double objective_diff = |
| 534 | std::fabs(objective_function_value1 - objective_function_value0) / |
| 535 | std::max(1.0, std::fabs(objective_function_value0)); |
| 536 | REQUIRE(objective_diff < 1e-12); |
| 537 | } |
| 538 | highs.resetGlobalScheduler(true); |
| 539 | } |
| 540 | |
| 541 | TEST_CASE("highs-callback-mip-user-solution", "[highs-callback]") { |
| 542 | runMipUserSolutionTest(userkMipUserSolution); |
no test coverage detected