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.
85 lines
2.5 KiB
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
|