You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MIPLearn.jl/src/solvers/learning_solver.jl

85 lines
2.5 KiB

# MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization
# Copyright (C) 2020-2021, UChicago Argonne, LLC. All rights reserved.
# Released under the modified BSD license. See COPYING.md for more details.
using Distributed
using JLD2
function LearningSolver(
optimizer_factory;
components = nothing,
mode::AbstractString = "exact",
simulate_perfect::Bool = false,
solve_lp::Bool = true,
extract_sa::Bool = true,
extract_lhs::Bool = true,
)::LearningSolver
return LearningSolver(
miplearn.LearningSolver(
solver = JuMPSolver(optimizer_factory),
mode = mode,
solve_lp = solve_lp,
simulate_perfect = simulate_perfect,
components = components,
extract_lhs = extract_lhs,
extract_sa = extract_sa,
),
optimizer_factory,
)
end
function solve!(
solver::LearningSolver,
instance::Instance;
tee::Bool = false,
discard_output::Bool = false,
)
return @python_call solver.py.solve(
instance.py,
tee = tee,
discard_output = discard_output,
)
end
function fit!(solver::LearningSolver, instances::Vector{<:Instance})
@python_call solver.py.fit([instance.py for instance in instances])
return
end
function save(filename::AbstractString, solver::LearningSolver)
internal_solver = solver.py.internal_solver
internal_solver_prototype = solver.py.internal_solver_prototype
solver.py.internal_solver = nothing
solver.py.internal_solver_prototype = nothing
solver_py_filename = tempname()
miplearn.write_pickle_gz(solver.py, solver_py_filename)
solver_py = read(solver_py_filename)
solver.py.internal_solver = internal_solver
solver.py.internal_solver_prototype = internal_solver_prototype
jldsave(
filename;
miplearn_version = "0.2",
solver_py = solver_py,
optimizer_factory = solver.optimizer_factory,
)
return
end
function load_solver(filename::AbstractString)::LearningSolver
jldopen(filename, "r") do file
solve_py_filename = tempname()
write(solve_py_filename, file["solver_py"])
solver_py = miplearn.read_pickle_gz(solve_py_filename)
internal_solver = JuMPSolver(file["optimizer_factory"])
solver_py.internal_solver_prototype = internal_solver
return LearningSolver(solver_py, file["optimizer_factory"])
end
end
export Instance, LearningSolver, solve!, fit!, parallel_solve!, save, load_solver