[Bazel] enable highs for linear_solver by default; better support for highs in linear_solver; read .lp file in solve_model.py

This commit is contained in:
Laurent Perron
2025-08-05 10:26:22 -07:00
parent 9fa0db877b
commit 4ffb359524
3 changed files with 21 additions and 19 deletions

View File

@@ -97,7 +97,7 @@ config_setting(
bool_flag(
name = "with_highs",
build_setting_default = False,
build_setting_default = True,
)
config_setting(
@@ -316,6 +316,12 @@ cc_library(
"@scip",
],
"//conditions:default": [],
})+ select({
":use_highs": [
"//ortools/linear_solver/proto_solver:highs_proto_solver",
"@highs",
],
"//conditions:default": [],
}),
)

View File

@@ -114,23 +114,6 @@ MPSolver::ResultStatus HighsInterface::Solve(const MPSolverParameters& param) {
Reset();
ExtractModel();
SetParameters(param);
if (quiet_) {
// parameters_.set_verbosity_level(0);
} else {
// parameters_.set_verbosity_level(3);
}
solver_->SetSolverSpecificParametersAsString(
solver_->solver_specific_parameter_string_);
// Time limit.
if (solver_->time_limit()) {
VLOG(1) << "Setting time limit = " << solver_->time_limit() << " ms.";
// parameters_.mutable_termination_criteria()->set_time_sec_limit(
// static_cast<double>(solver_->time_limit()) / 1000.0);
}
// Mark variables and constraints as extracted.
for (int i = 0; i < solver_->variables_.size(); ++i) {
set_variable_as_extracted(i, true);
@@ -147,6 +130,15 @@ MPSolver::ResultStatus HighsInterface::Solve(const MPSolverParameters& param) {
? MPModelRequest::HIGHS_MIXED_INTEGER_PROGRAMMING
: MPModelRequest::HIGHS_LINEAR_PROGRAMMING);
SetParameters(param);
request.set_enable_internal_solver_output(!quiet_);
request.set_solver_specific_parameters(
solver_->solver_specific_parameter_string_);
if (solver_->time_limit()) {
request.set_solver_time_limit_seconds(
static_cast<double>(solver_->time_limit()) / 1000.0);
}
// Set parameters.
absl::StatusOr<MPSolutionResponse> response =
HighsSolveProto(std::move(request));

View File

@@ -32,11 +32,15 @@ def main(argv: Sequence[str]) -> None:
model = model_builder.ModelBuilder()
# Load MPS or proto file.
# Load MPS, LP, or proto file.
if _INPUT.value.endswith(".mps"):
if not model.import_from_mps_file(_INPUT.value):
print(f"Cannot import MPS file: '{_INPUT.value}'")
return
elif _INPUT.value.endswith(".lp"):
if not model.import_from_lp_file(_INPUT.value):
print(f"Cannot import LP file: '{_INPUT.value}'")
return
elif not model.import_from_proto_file(_INPUT.value):
print(f"Cannot import Proto file: '{_INPUT.value}'")
return