Save and load LearningSolver; fix parallel_solve

master
Alinson S. Xavier 4 years ago
parent 159a61abc1
commit c6b76f57d2

@ -90,7 +90,7 @@ function save(filename::AbstractString, instance::JuMPInstance)::Nothing
# Generate JLD2 file # Generate JLD2 file
jldsave( jldsave(
filename; filename;
miplearn_version=0.2, miplearn_version="0.2",
mps=mps, mps=mps,
ext=ext_names, ext=ext_names,
py_samples=py_samples, py_samples=py_samples,
@ -100,16 +100,23 @@ function save(filename::AbstractString, instance::JuMPInstance)::Nothing
return return
end end
function _check_miplearn_version(file)
v = file["miplearn_version"]
v == "0.2" || error(
"The file you are trying to load has been generated by " *
"MIPLearn $(v) and you are currently running MIPLearn 0.2. " *
"Reading files generated by different versions of MIPLearn is " *
"not currently supported."
)
end
function load_jump_instance(filename::AbstractString)::JuMPInstance function load_jump_instance(filename::AbstractString)::JuMPInstance
@info "Reading: $filename" @info "Reading: $filename"
instance = nothing instance = nothing
time = @elapsed begin time = @elapsed begin
jldopen(filename, "r") do file jldopen(filename, "r") do file
file["miplearn_version"] == 0.2 || error( _check_miplearn_version(file)
"MIPLearn version 0.2 cannot read instance files generated by " *
"version $(file["miplearn_version"])."
)
# Convert MPS to JuMP # Convert MPS to JuMP
mps_filename = "$(tempname()).mps.gz" mps_filename = "$(tempname()).mps.gz"

@ -37,16 +37,68 @@ end
function parallel_solve!(solver::LearningSolver, instances::Vector{FileInstance}) function parallel_solve!(solver::LearningSolver, instances::Vector{FileInstance})
filenames = [instance.filename for instance in instances] filenames = [instance.filename for instance in instances]
optimizer_factory = solver.optimizer_factory optimizer_factory = solver.optimizer_factory
solver_filename = tempname()
save(solver_filename, solver)
@sync @distributed for filename in filenames @sync @distributed for filename in filenames
s = LearningSolver(optimizer_factory) s = load_solver(solver_filename)
solve!(s, FileInstance(filename)) solve!(s, FileInstance(filename))
nothing nothing
end end
end end
function save(filename::AbstractString, solver::LearningSolver)
@info "Writing: $filename"
time = @elapsed begin
# Pickle solver.py
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, quiet=true)
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,
)
end
@info @sprintf("File written in %.2f seconds", time)
return
end
function load_solver(filename::AbstractString)::LearningSolver
@info "Reading: $filename"
solver = nothing
time = @elapsed begin
jldopen(filename, "r") do file
_check_miplearn_version(file)
solve_py_filename = tempname()
write(solve_py_filename, file["solver_py"])
solver_py = miplearn.read_pickle_gz(solve_py_filename, quiet=true)
internal_solver = JuMPSolver(file["optimizer_factory"])
solver_py.internal_solver_prototype = internal_solver
solver = LearningSolver(
solver_py,
file["optimizer_factory"],
)
end
end
@info @sprintf("File read in %.2f seconds", time)
return solver
end
export Instance, export Instance,
LearningSolver, LearningSolver,
solve!, solve!,
fit!, fit!,
parallel_solve! parallel_solve!,
save,
load_solver

@ -56,5 +56,16 @@ using Gurobi
solver = LearningSolver(Gurobi.Optimizer) solver = LearningSolver(Gurobi.Optimizer)
instance = JuMPInstance(model) instance = JuMPInstance(model)
stats = solve!(solver, instance) stats = solve!(solver, instance)
@test stats["mip_lower_bound"] == 2.0
end
@testset "Save and load" begin
solver = LearningSolver(Gurobi.Optimizer)
solver.py.components = "Placeholder"
filename = tempname()
save(filename, solver)
@test isfile(filename)
loaded = load_solver(filename)
@test loaded.py.components == "Placeholder"
end end
end end

Loading…
Cancel
Save