| 375 | } |
| 376 | |
| 377 | void testUnboundedMpsLp(const std::string model, |
| 378 | const ObjSense sense = ObjSense::kMinimize) { |
| 379 | Highs highs; |
| 380 | if (!dev_run) highs.setOptionValue("output_flag", false); |
| 381 | if (dev_run) highs.setOptionValue("log_dev_level", 1); |
| 382 | |
| 383 | std::string model_file; |
| 384 | HighsLp lp; |
| 385 | HighsModelStatus require_model_status; |
| 386 | HighsStatus require_status; |
| 387 | bool has_dual_ray; |
| 388 | bool has_primal_ray; |
| 389 | vector<double> dual_ray_value; |
| 390 | vector<double> primal_ray_value; |
| 391 | REQUIRE(highs.setOptionValue("presolve", "off") == HighsStatus::kOk); |
| 392 | |
| 393 | // Test dual ray for unbounded LP |
| 394 | model_file = std::string(HIGHS_DIR) + "/check/instances/" + model + ".mps"; |
| 395 | require_model_status = HighsModelStatus::kUnbounded; |
| 396 | // gas11 contains small nonzero matrix entries, so readModel yield |
| 397 | // HighsStatus::kWarning |
| 398 | require_status = model == "gas11" ? HighsStatus::kWarning : HighsStatus::kOk; |
| 399 | REQUIRE(highs.readModel(model_file) == require_status); |
| 400 | REQUIRE(highs.changeObjectiveSense(sense) == HighsStatus::kOk); |
| 401 | lp = highs.getLp(); |
| 402 | lp.model_name_ = model; |
| 403 | REQUIRE(highs.setBasis() == HighsStatus::kOk); |
| 404 | REQUIRE(highs.run() == HighsStatus::kOk); |
| 405 | |
| 406 | if (dev_run) |
| 407 | printf("Solved %s with presolve: status = %s\n", lp.model_name_.c_str(), |
| 408 | highs.modelStatusToString(highs.getModelStatus()).c_str()); |
| 409 | REQUIRE(highs.getModelStatus() == require_model_status); |
| 410 | |
| 411 | // Check that there is no dual ray |
| 412 | REQUIRE(highs.getDualRay(has_dual_ray) == HighsStatus::kOk); |
| 413 | REQUIRE(!has_dual_ray); |
| 414 | // ... even if forcing |
| 415 | dual_ray_value.resize(lp.num_row_); |
| 416 | REQUIRE(highs.getDualRay(has_dual_ray, dual_ray_value.data()) == |
| 417 | HighsStatus::kOk); |
| 418 | REQUIRE(!has_dual_ray); |
| 419 | |
| 420 | // Check that there is a primal ray |
| 421 | primal_ray_value.resize(lp.num_col_); |
| 422 | REQUIRE(highs.getPrimalRay(has_primal_ray) == HighsStatus::kOk); |
| 423 | REQUIRE(has_primal_ray); |
| 424 | REQUIRE(highs.getPrimalRay(has_primal_ray, primal_ray_value.data()) == |
| 425 | HighsStatus::kOk); |
| 426 | REQUIRE(has_primal_ray); |
| 427 | REQUIRE(checkPrimalRayValue(highs, primal_ray_value)); |
| 428 | |
| 429 | highs.resetGlobalScheduler(true); |
| 430 | } |
| 431 | |
| 432 | TEST_CASE("Rays", "[highs_test_rays]") { |
| 433 | Highs highs; |
no test coverage detected