From 35c5110a3749289957ca3d86f760f2dc0afce3cd Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Tue, 15 Nov 2022 18:51:43 +0100 Subject: [PATCH] move solve to a separate file --- src/PropertyT.jl | 1 + src/solve.jl | 63 +++++++++++++++++++++++++++++++++++++++++++++++ src/sos_sdps.jl | 64 ------------------------------------------------ 3 files changed, 64 insertions(+), 64 deletions(-) create mode 100644 src/solve.jl diff --git a/src/PropertyT.jl b/src/PropertyT.jl index c9adba4..50495a5 100644 --- a/src/PropertyT.jl +++ b/src/PropertyT.jl @@ -15,6 +15,7 @@ import SymbolicWedderburn.PermutationGroups include("constraint_matrix.jl") include("sos_sdps.jl") +include("solve.jl") include("certify.jl") include("sqadjop.jl") diff --git a/src/solve.jl b/src/solve.jl new file mode 100644 index 0000000..9d76194 --- /dev/null +++ b/src/solve.jl @@ -0,0 +1,63 @@ +## Low-level solve + +setwarmstart!(model::JuMP.Model, ::Nothing) = model + +function setwarmstart!(model::JuMP.Model, warmstart) + constraint_map = Dict( + ct => JuMP.all_constraints(model, ct...) for + ct in JuMP.list_of_constraint_types(model) + ) + + JuMP.set_start_value.(JuMP.all_variables(model), warmstart.primal) + + for (ct, idx) in pairs(constraint_map) + JuMP.set_start_value.(idx, warmstart.slack[ct]) + JuMP.set_dual_start_value.(idx, warmstart.dual[ct]) + end + return model +end + +function getwarmstart(model::JuMP.Model) + constraint_map = Dict( + ct => JuMP.all_constraints(model, ct...) for + ct in JuMP.list_of_constraint_types(model) + ) + + primal = value.(JuMP.all_variables(model)) + + slack = Dict(k => value.(v) for (k, v) in constraint_map) + duals = Dict(k => JuMP.dual.(v) for (k, v) in constraint_map) + + return (primal=primal, dual=duals, slack=slack) +end + +function solve(m::JuMP.Model, optimizer, warmstart=nothing) + + JuMP.set_optimizer(m, optimizer) + MOIU.attach_optimizer(m) + + m = setwarmstart!(m, warmstart) + + JuMP.optimize!(m) + Base.Libc.flush_cstdio() + + status = JuMP.termination_status(m) + + return status, getwarmstart(m) +end + +function solve(solverlog::String, m::JuMP.Model, optimizer, warmstart=nothing) + + isdir(dirname(solverlog)) || mkpath(dirname(solverlog)) + + Base.flush(Base.stdout) + Base.Libc.flush_cstdio() + status, warmstart = open(solverlog, "a+") do logfile + redirect_stdout(logfile) do + status, warmstart = solve(m, optimizer, warmstart) + status, warmstart + end + end + + return status, warmstart +end diff --git a/src/sos_sdps.jl b/src/sos_sdps.jl index 96c71c3..795ffac 100644 --- a/src/sos_sdps.jl +++ b/src/sos_sdps.jl @@ -326,67 +326,3 @@ function reconstruct!( return res end -## -# Low-level solve - -setwarmstart!(model::JuMP.Model, ::Nothing) = model - -function setwarmstart!(model::JuMP.Model, warmstart) - constraint_map = Dict( - ct => JuMP.all_constraints(model, ct...) for - ct in JuMP.list_of_constraint_types(model) - ) - - JuMP.set_start_value.(JuMP.all_variables(model), warmstart.primal) - - for (ct, idx) in pairs(constraint_map) - JuMP.set_start_value.(idx, warmstart.slack[ct]) - JuMP.set_dual_start_value.(idx, warmstart.dual[ct]) - end - return model -end - -function getwarmstart(model::JuMP.Model) - constraint_map = Dict( - ct => JuMP.all_constraints(model, ct...) for - ct in JuMP.list_of_constraint_types(model) - ) - - primal = value.(JuMP.all_variables(model)) - - slack = Dict(k => value.(v) for (k, v) in constraint_map) - duals = Dict(k => JuMP.dual.(v) for (k, v) in constraint_map) - - return (primal=primal, dual=duals, slack=slack) -end - -function solve(m::JuMP.Model, optimizer, warmstart=nothing) - - JuMP.set_optimizer(m, optimizer) - MOIU.attach_optimizer(m) - - m = setwarmstart!(m, warmstart) - - JuMP.optimize!(m) - Base.Libc.flush_cstdio() - - status = JuMP.termination_status(m) - - return status, getwarmstart(m) -end - -function solve(solverlog::String, m::JuMP.Model, optimizer, warmstart=nothing) - - isdir(dirname(solverlog)) || mkpath(dirname(solverlog)) - - Base.flush(Base.stdout) - Base.Libc.flush_cstdio() - status, warmstart = open(solverlog, "a+") do logfile - redirect_stdout(logfile) do - status, warmstart = solve(m, optimizer, warmstart) - status, warmstart - end - end - - return status, warmstart -end