From 00642d5a18f2f9bb57681fb990cd93628e6373ac Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Sun, 23 May 2021 15:57:03 +0200 Subject: [PATCH 01/13] vector of optimizers in formulation --- src/Algorithm/basic/pricingcallback.jl | 7 ++- src/Algorithm/basic/solveipform.jl | 13 +++-- src/Algorithm/basic/solvelpform.jl | 9 ++-- src/Algorithm/colgen.jl | 8 +-- src/Algorithm/conquer.jl | 2 +- src/Algorithm/pricing.jl | 27 ++++++----- src/MathProg/MOIinterface.jl | 67 +++++++++++++++----------- src/MathProg/MathProg.jl | 6 +-- src/MathProg/formulation.jl | 50 +++++++------------ src/MathProg/optimizerwrappers.jl | 37 +++++++++----- src/decomposition.jl | 26 +++++----- test/pricing_callback_tests.jl | 6 +-- test/show_functions_tests.jl | 2 +- test/unit/MathProg/buffer.jl | 14 +++--- 14 files changed, 146 insertions(+), 128 deletions(-) diff --git a/src/Algorithm/basic/pricingcallback.jl b/src/Algorithm/basic/pricingcallback.jl index cb46b6bd6..80f27d353 100644 --- a/src/Algorithm/basic/pricingcallback.jl +++ b/src/Algorithm/basic/pricingcallback.jl @@ -13,7 +13,10 @@ function get_units_usage(algo::PricingCallback, spform::Formulation{DwSp}) return units_usage end -function run!(algo::PricingCallback, env::Env, spform::Formulation{DwSp}, input::OptimizationInput)::OptimizationOutput +function run!( + algo::PricingCallback, env::Env, spform::Formulation{DwSp}, input::OptimizationInput, + solver_id::Int = 1 +)::OptimizationOutput result = OptimizationState( spform, ip_primal_bound = get_ip_primal_bound(getoptstate(input)), @@ -22,7 +25,7 @@ function run!(algo::PricingCallback, env::Env, spform::Formulation{DwSp}, input: @logmsg LogLevel(-2) "Calling user-defined optimization function." - optimizer = getuseroptimizer(spform) + optimizer = getoptimizer(spform, solver_id) cbdata = MathProg.PricingCallbackData(spform, algo.stage) optimizer.user_oracle(cbdata) diff --git a/src/Algorithm/basic/solveipform.jl b/src/Algorithm/basic/solveipform.jl index 275997873..5dcca7e1b 100644 --- a/src/Algorithm/basic/solveipform.jl +++ b/src/Algorithm/basic/solveipform.jl @@ -48,15 +48,18 @@ function check_if_optimizer_supports_ip(optimizer::MoiOptimizer) end check_if_optimizer_supports_ip(optimizer::UserOptimizer) = false check_if_optimizer_supports_ip(optimizer::NoOptimizer) = false - -function run!(algo::SolveIpForm, env::Env, form::Formulation, input::OptimizationInput)::OptimizationOutput + +function run!( + algo::SolveIpForm, env::Env, form::Formulation, input::OptimizationInput, + solver_id::Int = 1 +)::OptimizationOutput result = OptimizationState( form, ip_primal_bound = get_ip_primal_bound(getoptstate(input)), max_length_ip_primal_sols = algo.max_nb_ip_primal_sols ) - ip_supported = check_if_optimizer_supports_ip(getmoioptimizer(form)) + ip_supported = check_if_optimizer_supports_ip(getoptimizer(form, solver_id)) if !ip_supported @warn "Optimizer of formulation with id =", getuid(form), " does not support integer variables. Skip SolveIpForm algorithm." @@ -64,7 +67,7 @@ function run!(algo::SolveIpForm, env::Env, form::Formulation, input::Optimizatio return OptimizationOutput(result) end - primal_sols = optimize_ip_form!(algo, getmoioptimizer(form), form, result) + primal_sols = optimize_ip_form!(algo, getoptimizer(form, solver_id), form, result) partial_sol = nothing partial_sol_value = 0.0 @@ -134,7 +137,7 @@ end function optimize_with_moi!(optimizer::MoiOptimizer, form::Formulation, result::OptimizationState) sync_solver!(optimizer, form) - nbvars = MOI.get(form.moioptimizer.inner, MOI.NumberOfVariables()) + nbvars = MOI.get(optimizer.inner, MOI.NumberOfVariables()) if nbvars <= 0 @warn "No variable in the formulation." end diff --git a/src/Algorithm/basic/solvelpform.jl b/src/Algorithm/basic/solvelpform.jl index be4213ba4..4b335aab6 100644 --- a/src/Algorithm/basic/solvelpform.jl +++ b/src/Algorithm/basic/solvelpform.jl @@ -46,12 +46,15 @@ end function optimize_lp_form!( algo::SolveLpForm, optimizer::MoiOptimizer, form::Formulation, result::OptimizationState ) - MOI.set(form.moioptimizer.inner, MOI.Silent(), algo.silent) + MOI.set(optimizer.inner, MOI.Silent(), algo.silent) optimize_with_moi!(optimizer, form, result) return end -function run!(algo::SolveLpForm, env::Env, form::Formulation, input::OptimizationInput)::OptimizationOutput +function run!( + algo::SolveLpForm, env::Env, form::Formulation, input::OptimizationInput, + solver_id::Int = 1 +)::OptimizationOutput result = OptimizationState(form) TO.@timeit Coluna._to "SolveLpForm" begin @@ -68,7 +71,7 @@ function run!(algo::SolveLpForm, env::Env, form::Formulation, input::Optimizatio partial_sol_val = getvalue(partial_sol) end - optimizer = getmoioptimizer(form) + optimizer = getoptimizer(form, solver_id) optimize_lp_form!(algo, optimizer, form, result) primal_sols = get_primal_solutions(form, optimizer) diff --git a/src/Algorithm/colgen.jl b/src/Algorithm/colgen.jl index 35952a9f5..d55813b5a 100644 --- a/src/Algorithm/colgen.jl +++ b/src/Algorithm/colgen.jl @@ -19,6 +19,7 @@ restricted master and `pricing_prob_solve_alg` to solve the subproblems. """ @with_kw struct ColumnGeneration <: AbstractOptimizationAlgorithm restr_master_solve_alg = SolveLpForm(get_dual_solution=true) + restr_master_solver_id = 1 # TODO : pricing problem solver may be different depending on the # pricing subproblem pricing_prob_solve_alg = DefaultPricing() @@ -45,7 +46,7 @@ function get_child_algorithms(algo::ColumnGeneration, reform::Reformulation) push!(child_algs, (algo.pricing_prob_solve_alg, spform)) end return child_algs -end +end function get_units_usage(algo::ColumnGeneration, reform::Reformulation) units_usage = Tuple{AbstractModel,UnitType,UnitAccessMode}[] @@ -418,9 +419,10 @@ function cleanup_columns(algo::ColumnGeneration, iteration::Int64, master::Formu iteration % 10 != 0 && return cols_with_redcost = Vector{Pair{Variable,Float64}}() + optimizer = getoptimizer(master, algo.restr_master_solver_id) for (id, var) in getvars(master) if getduty(id) <= MasterCol && iscuractive(master, var) && isexplicit(master, var) - push!(cols_with_redcost, var => getreducedcost(master, var)) + push!(cols_with_redcost, var => getreducedcost(master, optimizer, var)) end end @@ -611,7 +613,7 @@ function cg_main_loop!( rm_input = OptimizationInput( OptimizationState(masterform, ip_primal_bound=get_ip_primal_bound(cg_optstate)) ) - rm_output = run!(algo.restr_master_solve_alg, env, masterform, rm_input) + rm_output = run!(algo.restr_master_solve_alg, env, masterform, rm_input, algo.restr_master_solver_id) end rm_optstate = getoptstate(rm_output) diff --git a/src/Algorithm/conquer.jl b/src/Algorithm/conquer.jl index 6baebd609..768a440a6 100644 --- a/src/Algorithm/conquer.jl +++ b/src/Algorithm/conquer.jl @@ -77,7 +77,7 @@ struct ParameterisedHeuristic nonroot_priority::Float64 frequency::Integer max_depth::Integer - name::String + name::String end DefaultRestrictedMasterHeuristic() = diff --git a/src/Algorithm/pricing.jl b/src/Algorithm/pricing.jl index 1110f0a57..7ba292016 100644 --- a/src/Algorithm/pricing.jl +++ b/src/Algorithm/pricing.jl @@ -1,25 +1,26 @@ @with_kw struct DefaultPricing <: AbstractOptimizationAlgorithm pricing_callback::PricingCallback = PricingCallback() solve_ip_form::SolveIpForm = SolveIpForm(deactivate_artificial_vars=false, enforce_integrality=false, log_level=2) - dispatch::Int = 0 # 0 - automatic, 1 - impose pricing callback, 2 - impose pricing by MIP + solver_id::Int = 1 end +_child_algorithm(algo::DefaultPricing, ::MoiOptimizer) = algo.solve_ip_form +_child_algorithm(algo::DefaultPricing, ::UserOptimizer) = algo.pricing_callback +_child_algorithm(::DefaultPricing, ::NoOptimizer) = nothing + function get_child_algorithms(algo::DefaultPricing, spform::Formulation{DwSp}) child_algs = Tuple{AbstractAlgorithm,AbstractModel}[] - algo.dispatch != 2 && push!(child_algs, (algo.pricing_callback, spform)) - algo.dispatch != 1 && push!(child_algs, (algo.solve_ip_form, spform)) + opt = getoptimizer(spform, algo.solver_id) + if _child_algorithm(algo, opt) !== nothing + push!(child_algs, (_child_algorithm(algo, opt), spform)) + end return child_algs -end +end function run!(algo::DefaultPricing, env::Env, spform::Formulation{DwSp}, input::OptimizationInput)::OptimizationOutput - - if algo.dispatch == 1 && !isa(getuseroptimizer(spform), UserOptimizer) - @error string("Pricing callback is imposed but not defined") - end - - if algo.dispatch != 2 && isa(getuseroptimizer(spform), UserOptimizer) - return run!(algo.pricing_callback, env, spform, input) + opt = getoptimizer(spform, algo.solver_id) + if _child_algorithm(algo, opt) !== nothing + return run!(_child_algorithm(algo, opt), env, spform, input, algo.solver_id) end - - return run!(algo.solve_ip_form, env, spform, input) + return error("Cannot optimize LP formulation with optimizer of type $(typeof(opt)).") end \ No newline at end of file diff --git a/src/MathProg/MOIinterface.jl b/src/MathProg/MOIinterface.jl index 88c8de7e1..d38829f9c 100644 --- a/src/MathProg/MOIinterface.jl +++ b/src/MathProg/MOIinterface.jl @@ -17,8 +17,7 @@ function set_obj_sense!(optimizer::MoiOptimizer, ::Type{<:MinSense}) return end -function update_bounds_in_optimizer!(form::Formulation, var::Variable) - optimizer = getmoioptimizer(form) +function update_bounds_in_optimizer!(form::Formulation, optimizer::MoiOptimizer, var::Variable) inner = getinner(optimizer) moi_record = getmoirecord(var) moi_kind = getkind(moi_record) @@ -42,8 +41,7 @@ function update_bounds_in_optimizer!(form::Formulation, var::Variable) end end -function update_cost_in_optimizer!(form::Formulation, var::Variable) - optimizer = getmoioptimizer(form) +function update_cost_in_optimizer!(form::Formulation, optimizer::MoiOptimizer, var::Variable) cost = getcurcost(form, var) moi_index = getindex(getmoirecord(var)) MOI.modify( @@ -53,8 +51,7 @@ function update_cost_in_optimizer!(form::Formulation, var::Variable) return end -function update_obj_const_in_optimizer!(form::Formulation) - optimizer = getmoioptimizer(form) +function update_obj_const_in_optimizer!(form::Formulation, optimizer::MoiOptimizer) MOI.modify( getinner(optimizer), MoiObjective(), MOI.ScalarConstantChange{Float64}(getobjconst(form)) @@ -74,8 +71,9 @@ function update_constr_member_in_optimizer!(optimizer::MoiOptimizer, return end -function update_constr_rhs_in_optimizer!(form::Formulation, constr::Constraint) - optimizer = getmoioptimizer(form) +function update_constr_rhs_in_optimizer!( + form::Formulation, optimizer::MoiOptimizer, constr::Constraint +) moi_c_index = getindex(getmoirecord(constr)) rhs = getcurrhs(form, constr) sense = getcursense(form, constr) @@ -83,8 +81,9 @@ function update_constr_rhs_in_optimizer!(form::Formulation, constr::Constraint) return end -function enforce_bounds_in_optimizer!(form::Formulation, var::Variable) - optimizer = getmoioptimizer(form) +function enforce_bounds_in_optimizer!( + form::Formulation, optimizer::MoiOptimizer, var::Variable +) moirecord = getmoirecord(var) moi_bounds = MOI.add_constraint( getinner(optimizer), MOI.SingleVariable(getindex(moirecord)), @@ -94,8 +93,10 @@ function enforce_bounds_in_optimizer!(form::Formulation, var::Variable) return end -function enforce_kind_in_optimizer!(form::Formulation, v::Variable) - inner = getinner(getmoioptimizer(form)) +function enforce_kind_in_optimizer!( + form::Formulation, optimizer::MoiOptimizer, v::Variable +) + inner = getinner(optimizer) kind = getcurkind(form, v) moirecord = getmoirecord(v) moi_kind = getkind(moirecord) @@ -112,24 +113,23 @@ function enforce_kind_in_optimizer!(form::Formulation, v::Variable) return end -function add_to_optimizer!(form::Formulation, var::Variable) - optimizer = getmoioptimizer(form) +function add_to_optimizer!(form::Formulation, optimizer::MoiOptimizer, var::Variable) inner = getinner(optimizer) moirecord = getmoirecord(var) moi_index = MOI.add_variable(inner) setindex!(moirecord, moi_index) - update_cost_in_optimizer!(form, var) - enforce_kind_in_optimizer!(form, var) - enforce_bounds_in_optimizer!(form, var) + update_cost_in_optimizer!(form, optimizer, var) + enforce_kind_in_optimizer!(form, optimizer, var) + enforce_bounds_in_optimizer!(form, optimizer, var) MOI.set(inner, MOI.VariableName(), moi_index, getname(form, var)) return end -function add_to_optimizer!(form::Formulation, constr::Constraint, var_checker::Function) +function add_to_optimizer!( + form::Formulation, optimizer::MoiOptimizer, constr::Constraint, var_checker::Function +) constr_id = getid(constr) - - inner = getinner(getmoioptimizer(form)) - + inner = getinner(optimizer) matrix = getcoefmatrix(form) terms = MOI.ScalarAffineTerm{Float64}[] for (varid, coeff) in @view matrix[constr_id, :] @@ -151,8 +151,18 @@ function add_to_optimizer!(form::Formulation, constr::Constraint, var_checker::F return end -function remove_from_optimizer!(form::Formulation, var::Variable) - inner = getinner(form.moioptimizer) +function remove_from_optimizer!(form::Formulation, optimizer::MoiOptimizer, ids::Set{Id{T}}) where { + T <: AbstractVarConstr} + for id in ids + vc = getelem(form, id) + @logmsg LogLevel(-3) string("Removing varconstr of name ", getname(form, vc)) + remove_from_optimizer!(form, optimizer, vc) + end + return +end + +function remove_from_optimizer!(::Formulation, optimizer::MoiOptimizer, var::Variable) + inner = getinner(optimizer) moirecord = getmoirecord(var) @assert getindex(moirecord).value != -1 MOI.delete(inner, getbounds(moirecord)) @@ -164,10 +174,12 @@ function remove_from_optimizer!(form::Formulation, var::Variable) return end -function remove_from_optimizer!(form::Formulation, constr::Constraint) +function remove_from_optimizer!( + ::Formulation, optimizer::MoiOptimizer, constr::Constraint +) moirecord = getmoirecord(constr) @assert getindex(moirecord).value != -1 - MOI.delete(getinner(form.moioptimizer), getindex(moirecord)) + MOI.delete(getinner(optimizer), getindex(moirecord)) setindex!(moirecord, MoiConstrIndex()) return end @@ -188,7 +200,7 @@ function _getreducedcost(form::Formulation, optimizer, var::Variable) return nothing end -function _getreducedcost(form::Formulation, optimizer::MoiOptimizer, var::Variable) +function getreducedcost(form::Formulation, optimizer::MoiOptimizer, var::Variable) sign = getobjsense(form) == MinSense ? 1.0 : -1.0 inner = getinner(optimizer) if MOI.get(inner, MOI.ResultCount()) < 1 @@ -210,8 +222,7 @@ function _getreducedcost(form::Formulation, optimizer::MoiOptimizer, var::Variab dualval = MOI.get(inner, MOI.ConstraintDual(1), bounds_interval_idx) return sign * dualval end -getreducedcost(form::Formulation, var::Variable) = _getreducedcost(form, getmoioptimizer(form), var) -getreducedcost(form::Formulation, varid::VarId) = _getreducedcost(form, getmoioptimizer(form), getvar(form, varid)) +getreducedcost(form::Formulation, optimizer::MoiOptimizer, varid::VarId) = getreducedcost(form, optimizer, getvar(form, varid)) function get_primal_solutions(form::F, optimizer::MoiOptimizer) where {F <: Formulation} inner = getinner(optimizer) diff --git a/src/MathProg/MathProg.jl b/src/MathProg/MathProg.jl index 38ab4973e..04a5d4135 100644 --- a/src/MathProg/MathProg.jl +++ b/src/MathProg/MathProg.jl @@ -52,7 +52,7 @@ export MaxSense, MinSense, MoiOptimizer, export no_optimizer_builder, set_original_formulation!, getid, getuid, enforce_integrality!, relax_integrality!, - getobjsense, getmoioptimizer, getuseroptimizer, + getobjsense, getoptimizer, getoptimizers, setdualbound!, computereducedcost, update!, @@ -82,8 +82,8 @@ export AbstractFormulation, Formulation, create_formulation!, getreformulation, getdualsolmatrix, getdualsolrhss, setvar!, setconstr!, setprimalsol!, setdualsol!, set_robust_constr_generator!, get_robust_constr_generators, setcol_from_sp_primalsol!, setcut_from_sp_dualsol!, # TODO : merge with setvar! & setconstr - set_objective_sense!, clonevar!, cloneconstr!, clonecoeffs!, initialize_moioptimizer!, - getobjconst, setobjconst! + set_objective_sense!, clonevar!, cloneconstr!, clonecoeffs!, initialize_optimizer!, + push_optimizer!, getobjconst, setobjconst! # Duties of formulations export Original, DwMaster, BendersMaster, DwSp, BendersSp diff --git a/src/MathProg/formulation.jl b/src/MathProg/formulation.jl index 8b9d6707d..9c62e5208 100644 --- a/src/MathProg/formulation.jl +++ b/src/MathProg/formulation.jl @@ -3,14 +3,14 @@ mutable struct Formulation{Duty <: AbstractFormDuty} <: AbstractFormulation var_counter::Int constr_counter::Int parent_formulation::Union{AbstractFormulation, Nothing} # master for sp, reformulation for master - moioptimizer::AbstractOptimizer - useroptimizer::AbstractOptimizer + optimizers::Vector{AbstractOptimizer} manager::FormulationManager obj_sense::Type{<:Coluna.AbstractSense} buffer::FormulationBuffer storage::Storage end + """ `Formulation` stores a mixed-integer linear program. @@ -21,8 +21,8 @@ end obj_sense::Type{<:Coluna.AbstractSense} = MinSense ) - Create a new formulation in the Coluna's environment `env` with duty `duty`, - parent formulation `parent_formulation`, and objective sense `obj_sense`. +Create a new formulation in the Coluna's environment `env` with duty `duty`, +parent formulation `parent_formulation`, and objective sense `obj_sense`. """ function create_formulation!( env::Coluna.Env, @@ -34,9 +34,8 @@ function create_formulation!( error("Maximum number of formulations reached.") end return Formulation{duty}( - env.form_counter += 1, 0, 0, parent_formulation, NoOptimizer(), - NoOptimizer(), FormulationManager(), obj_sense, FormulationBuffer(), - Storage() + env.form_counter += 1, 0, 0, parent_formulation, AbstractOptimizer[], + FormulationManager(), obj_sense, FormulationBuffer(), Storage() ) end @@ -97,8 +96,13 @@ getuid(form::Formulation) = form.uid getobjsense(form::Formulation) = form.obj_sense "Returns the `AbstractOptimizer` of `Formulation` `form`." -getmoioptimizer(form::Formulation) = form.moioptimizer -getuseroptimizer(form::Formulation) = form.useroptimizer +function getoptimizer(form::Formulation, id::Int) + if id <= 0 && id > length(form.optimizers) + return NoOptimizer() + end + return form.optimizers[id] +end +getoptimizers(form::Formulation) = form.optimizers getelem(form::Formulation, id::VarId) = getvar(form, id) getelem(form::Formulation, id::ConstrId) = getconstr(form, id) @@ -117,7 +121,7 @@ _reset_buffer!(form::Formulation) = form.buffer = FormulationBuffer() """ set_matrix_coeff!(form::Formulation, v_id::Id{Variable}, c_id::Id{Constraint}, new_coeff::Float64) -Buffers the matrix modification in `form.buffer` to be sent to `form.moioptimizer` right before next call to optimize!. +Buffers the matrix modification in `form.buffer` to be sent to the optimizers right before next call to optimize!. """ set_matrix_coeff!( form::Formulation, varid::VarId, constrid::ConstrId, new_coeff::Float64 @@ -516,16 +520,6 @@ function set_objective_sense!(form::Formulation, min::Bool) return end -function remove_from_optimizer!(ids::Set{Id{T}}, form::Formulation) where { - T <: AbstractVarConstr} - for id in ids - vc = getelem(form, id) - @logmsg LogLevel(-3) string("Removing varconstr of name ", getname(form, vc)) - remove_from_optimizer!(form, vc) - end - return -end - function computesolvalue(form::Formulation, sol_vec::AbstractDict{Id{Variable}, Float64}) val = sum(getperencost(form, varid) * value for (varid, value) in sol_vec) return val @@ -563,10 +557,10 @@ function constraint_primal(primalsol::PrimalSolution, constrid::ConstrId) return val end -function initialize_moioptimizer!(form::Formulation, builder::Function) +function push_optimizer!(form::Formulation, builder::Function) opt = builder() - form.moioptimizer = opt - _initialize_moioptimizer!(opt, form) + push!(form.optimizers, opt) + initialize_optimizer!(opt, form) return end @@ -646,16 +640,6 @@ function Base.show(io::IO, form::Formulation{Duty}) where {Duty <: AbstractFormD return end -function write_to_LP_file(form::Formulation, filename::String) - optimizer = getmoioptimizer(form) - if isa(optimizer, MoiOptimizer) - src = getinner(optimizer) - dest = MOI.FileFormats.Model(format = MOI.FileFormats.FORMAT_LP) - MOI.copy_to(dest, src) - MOI.write_to_file(dest, filename) - end -end - # function getspsol(master::Formulation{DwMaster}, col_id::VarId) # !(getduty(col_id) <= MasterCol) && return diff --git a/src/MathProg/optimizerwrappers.jl b/src/MathProg/optimizerwrappers.jl index d7aaac051..e6b2793be 100644 --- a/src/MathProg/optimizerwrappers.jl +++ b/src/MathProg/optimizerwrappers.jl @@ -45,35 +45,37 @@ function sync_solver!(optimizer::MoiOptimizer, f::Formulation) # Remove constrs @logmsg LogLevel(-2) string("Removing constraints") - remove_from_optimizer!(buffer.constr_buffer.removed, f) + remove_from_optimizer!(f, optimizer, buffer.constr_buffer.removed) # Remove vars @logmsg LogLevel(-2) string("Removing variables") - remove_from_optimizer!(buffer.var_buffer.removed, f) + remove_from_optimizer!(f, optimizer, buffer.var_buffer.removed) # Add vars for id in buffer.var_buffer.added v = getvar(f, id) @logmsg LogLevel(-4) string("Adding variable ", getname(f, v)) - add_to_optimizer!(f, v) + add_to_optimizer!(f, optimizer, v) end # Add constrs for constr_id in buffer.constr_buffer.added constr = getconstr(f, constr_id) @logmsg LogLevel(-2) string("Adding constraint ", getname(f, constr)) - add_to_optimizer!(f, constr, (f, constr) -> iscuractive(f, constr) && isexplicit(f, constr)) + add_to_optimizer!( + f, optimizer, constr, (f, constr) -> iscuractive(f, constr) && isexplicit(f, constr) + ) end # Update variable costs for id in buffer.changed_cost (id in buffer.var_buffer.added || id in buffer.var_buffer.removed) && continue - update_cost_in_optimizer!(f, getvar(f, id)) + update_cost_in_optimizer!(f, optimizer, getvar(f, id)) end # Update objective constant if buffer.changed_obj_const - update_obj_const_in_optimizer!(f) + update_obj_const_in_optimizer!(f, optimizer) buffer.changed_obj_const = false end @@ -83,7 +85,7 @@ function sync_solver!(optimizer::MoiOptimizer, f::Formulation) @logmsg LogLevel(-4) "Changing bounds of variable " getname(f, id) @logmsg LogLevel(-5) string("New lower bound is ", getcurlb(f, id)) @logmsg LogLevel(-5) string("New upper bound is ", getcurub(f, id)) - update_bounds_in_optimizer!(f, getvar(f, id)) + update_bounds_in_optimizer!(f, optimizer, getvar(f, id)) end # Update variable kind @@ -91,7 +93,7 @@ function sync_solver!(optimizer::MoiOptimizer, f::Formulation) (id in buffer.var_buffer.added || id in buffer.var_buffer.removed) && continue @logmsg LogLevel(-3) "Changing kind of variable " getname(f, id) @logmsg LogLevel(-4) string("New kind is ", getcurkind(f, id)) - enforce_kind_in_optimizer!(f, getvar(f,id)) + enforce_kind_in_optimizer!(f, optimizer, getvar(f,id)) end # Update constraint rhs @@ -99,7 +101,7 @@ function sync_solver!(optimizer::MoiOptimizer, f::Formulation) (id in buffer.constr_buffer.added || id in buffer.constr_buffer.removed) && continue @logmsg LogLevel(-3) "Changing rhs of constraint " getname(f, id) @logmsg LogLevel(-4) string("New rhs is ", getcurrhs(f, id)) - update_constr_rhs_in_optimizer!(f, getconstr(f, id)) + update_constr_rhs_in_optimizer!(f, optimizer, getconstr(f, id)) end # Update matrix @@ -131,11 +133,20 @@ function sync_solver!(optimizer::MoiOptimizer, f::Formulation) end # Initialization of optimizers -function _initialize_moioptimizer!(optimizer::MoiOptimizer, form::Formulation) +function initialize_optimizer!(optimizer::MoiOptimizer, form::Formulation) f = MOI.ScalarAffineFunction(MOI.ScalarAffineTerm{Float64}[], 0.0) - MOI.set(form.moioptimizer.inner, MoiObjective(), f) - set_obj_sense!(form.moioptimizer, getobjsense(form)) + MOI.set(optimizer.inner, MoiObjective(), f) + set_obj_sense!(optimizer, getobjsense(form)) return end -_initialize_moioptimizer!(optimizer, form::Formulation) = return +initialize_optimizer!(optimizer, form::Formulation) = return + + +function write_to_LP_file(form::Formulation, optimizer::MoiOptimizer, filename::String) + src = getinner(optimizer) + dest = MOI.FileFormats.Model(format = MOI.FileFormats.FORMAT_LP) + MOI.copy_to(dest, src) + MOI.write_to_file(dest, filename) +end + diff --git a/src/decomposition.jl b/src/decomposition.jl index bb69d0e30..c6a1f1e1c 100644 --- a/src/decomposition.jl +++ b/src/decomposition.jl @@ -425,11 +425,16 @@ function assign_orig_vars_constrs!( clonecoeffs!(origform, destform) end -function getmoioptbuilder(prob::Problem, ann::BD.Annotation) - if BD.getoptimizerbuilder(ann) !== nothing - return () -> MoiOptimizer(BD.getoptimizerbuilder(ann)) +_optimizerbuilder(opt::Function) = () -> UserOptimizer(opt) +_optimizerbuilder(opt::MOI.AbstractOptimizer) = () -> MoiOptimizer(opt) + +function getoptimizerbuilders(prob::Problem, ann::BD.Annotation) + optimizers = BD.getoptimizerbuilders(ann) + + if length(optimizers) > 0 + return map(o -> _optimizerbuilder(o), optimizers) end - return prob.default_optimizer_builder + return [prob.default_optimizer_builder] end function buildformulations!( @@ -449,8 +454,8 @@ function buildformulations!( create_side_vars_constrs!(masterform, origform, env, annotations) create_artificial_vars!(masterform, env) closefillmode!(getcoefmatrix(masterform)) - initialize_moioptimizer!(masterform, getmoioptbuilder(prob, ann)) - initialize_moioptimizer!(origform, getmoioptbuilder(prob, ann)) + push_optimizer!.(Ref(masterform), getoptimizerbuilders(prob, ann)) + push_optimizer!.(Ref(origform), getoptimizerbuilders(prob, ann)) return end @@ -468,12 +473,7 @@ function buildformulations!( assign_orig_vars_constrs!(spform, origform, env, annotations, ann) create_side_vars_constrs!(spform, origform, env, annotations) closefillmode!(getcoefmatrix(spform)) - initialize_moioptimizer!(spform, getmoioptbuilder(prob, ann)) - - if BD.getpricingoracle(ann) !== nothing - spform.useroptimizer = UserOptimizer(BD.getpricingoracle(ann)) - end - + push_optimizer!.(Ref(spform), getoptimizerbuilders(prob, ann)) return end @@ -489,7 +489,7 @@ function reformulate!(prob::Problem, annotations::Annotations, env::Env) buildformulations!(prob, reform, env, annotations, reform, root) relax_integrality!(getmaster(reform)) else - initialize_moioptimizer!( + push_optimizer!( prob.original_formulation, prob.default_optimizer_builder ) diff --git a/test/pricing_callback_tests.jl b/test/pricing_callback_tests.jl index 3eec28431..cd0129d2c 100644 --- a/test/pricing_callback_tests.jl +++ b/test/pricing_callback_tests.jl @@ -11,11 +11,11 @@ function pricing_callback_tests() conqueralg = ClA.ColCutGenConquer( stages = [ClA.ColumnGeneration( pricing_prob_solve_alg = ClA.DefaultPricing( - dispatch=1, pricing_callback = PricingCallback(stage=1) + solver_id=2, pricing_callback = PricingCallback(stage=1) )), ClA.ColumnGeneration( pricing_prob_solve_alg = ClA.DefaultPricing( - dispatch=1, pricing_callback = PricingCallback(stage=2) + solver_id=2, pricing_callback = PricingCallback(stage=2) )) ] ) @@ -87,7 +87,7 @@ function pricing_callback_tests() master = BD.getmaster(dec) subproblems = BD.getsubproblems(dec) - BD.specify!.(subproblems, lower_multiplicity = 0, solver = my_pricing_callback) + BD.specify!.(subproblems, lower_multiplicity = 0, solver = [GLPK.Optimizer, my_pricing_callback]) JuMP.optimize!(model) @test nb_exact_calls < 30 # WARNING: this test is necessary to properly test stage 2. diff --git a/test/show_functions_tests.jl b/test/show_functions_tests.jl index ae4eaa08b..0b3eb00bb 100644 --- a/test/show_functions_tests.jl +++ b/test/show_functions_tests.jl @@ -9,5 +9,5 @@ function show_functions_tests() problem, x, dec = CLD.GeneralizedAssignment.model(data, coluna, true) @test occursin("A JuMP Model", repr(problem)) JuMP.optimize!(problem) - @test_nowarn Base.show(problem.moi_backend.inner.re_formulation.master.moioptimizer) + @test_nowarn Base.show(problem.moi_backend.inner.re_formulation.master.optimizers[1]) end diff --git a/test/unit/MathProg/buffer.jl b/test/unit/MathProg/buffer.jl index ed0a893eb..70a0c7240 100644 --- a/test/unit/MathProg/buffer.jl +++ b/test/unit/MathProg/buffer.jl @@ -1,6 +1,6 @@ function buffer_tests() form = create_formulation!(Env(Coluna.Params()), Original) - form.moioptimizer = MoiOptimizer(MOI._instantiate_and_check(GLPK.Optimizer)) + push!(form.optimizers, MoiOptimizer(MOI._instantiate_and_check(GLPK.Optimizer))) var = ClMP.setvar!( form, "var1", ClMP.OriginalVar, cost=2.0, lb=-1.0, ub=1.0, kind=ClMP.Integ, inc_val=4.0 @@ -14,35 +14,35 @@ function buffer_tests() # var `setcurcost!` ClMP.setcurcost!(form, var, 3.0) ClMP.deactivate!(form, var) - ClMP.sync_solver!(getmoioptimizer(form), form) + ClMP.sync_solver!(getoptimizer(form, 1), form) @test ClMP.iscuractive(form, var) == false # var `setcurkind!` ClMP.reset!(form, var) ClMP.setcurkind!(form, var, Integ) ClMP.deactivate!(form, var) - ClMP.sync_solver!(getmoioptimizer(form), form) + ClMP.sync_solver!(getoptimizer(form, 1), form) @test ClMP.iscuractive(form, var) == false # var `setcurlb!` ClMP.reset!(form, var) ClMP.setcurlb!(form, var, 0.0) ClMP.deactivate!(form, var) - ClMP.sync_solver!(getmoioptimizer(form), form) + ClMP.sync_solver!(getoptimizer(form, 1), form) @test ClMP.iscuractive(form, var) == false # var `setcurub!` ClMP.reset!(form, var) ClMP.setcurub!(form, var, 0.0) ClMP.deactivate!(form, var) - ClMP.sync_solver!(getmoioptimizer(form), form) + ClMP.sync_solver!(getoptimizer(form, 1), form) @test ClMP.iscuractive(form, var) == false # constr `setcurrhs!` ClMP.reset!(form, constr) ClMP.setcurrhs!(form, constr, 0.0) ClMP.deactivate!(form, constr) - ClMP.sync_solver!(getmoioptimizer(form), form) + ClMP.sync_solver!(getoptimizer(form, 1), form) @test ClMP.iscuractive(form, constr) == false # `set_matrix_coeff!` @@ -51,7 +51,7 @@ function buffer_tests() ClMP.set_matrix_coeff!(form, getid(var), getid(constr), 2.0) ClMP.deactivate!(form, var) ClMP.deactivate!(form, constr) - ClMP.sync_solver!(getmoioptimizer(form), form) + ClMP.sync_solver!(getoptimizer(form, 1), form) @test ClMP.iscuractive(form, var) == false @test ClMP.iscuractive(form, constr) == false end \ No newline at end of file From 1448f96ca991b8f3e06fadab50410efa0f83655c Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Sun, 23 May 2021 15:59:21 +0200 Subject: [PATCH 02/13] solver_id -> optimizer_id --- src/Algorithm/basic/pricingcallback.jl | 4 ++-- src/Algorithm/basic/solveipform.jl | 6 +++--- src/Algorithm/basic/solvelpform.jl | 4 ++-- src/Algorithm/colgen.jl | 6 +++--- src/Algorithm/pricing.jl | 8 ++++---- test/pricing_callback_tests.jl | 4 ++-- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Algorithm/basic/pricingcallback.jl b/src/Algorithm/basic/pricingcallback.jl index 80f27d353..018a62dc8 100644 --- a/src/Algorithm/basic/pricingcallback.jl +++ b/src/Algorithm/basic/pricingcallback.jl @@ -15,7 +15,7 @@ end function run!( algo::PricingCallback, env::Env, spform::Formulation{DwSp}, input::OptimizationInput, - solver_id::Int = 1 + optimizer_id::Int = 1 )::OptimizationOutput result = OptimizationState( spform, @@ -25,7 +25,7 @@ function run!( @logmsg LogLevel(-2) "Calling user-defined optimization function." - optimizer = getoptimizer(spform, solver_id) + optimizer = getoptimizer(spform, optimizer_id) cbdata = MathProg.PricingCallbackData(spform, algo.stage) optimizer.user_oracle(cbdata) diff --git a/src/Algorithm/basic/solveipform.jl b/src/Algorithm/basic/solveipform.jl index 5dcca7e1b..ce6753c81 100644 --- a/src/Algorithm/basic/solveipform.jl +++ b/src/Algorithm/basic/solveipform.jl @@ -51,7 +51,7 @@ check_if_optimizer_supports_ip(optimizer::NoOptimizer) = false function run!( algo::SolveIpForm, env::Env, form::Formulation, input::OptimizationInput, - solver_id::Int = 1 + optimizer_id::Int = 1 )::OptimizationOutput result = OptimizationState( form, @@ -59,7 +59,7 @@ function run!( max_length_ip_primal_sols = algo.max_nb_ip_primal_sols ) - ip_supported = check_if_optimizer_supports_ip(getoptimizer(form, solver_id)) + ip_supported = check_if_optimizer_supports_ip(getoptimizer(form, optimizer_id)) if !ip_supported @warn "Optimizer of formulation with id =", getuid(form), " does not support integer variables. Skip SolveIpForm algorithm." @@ -67,7 +67,7 @@ function run!( return OptimizationOutput(result) end - primal_sols = optimize_ip_form!(algo, getoptimizer(form, solver_id), form, result) + primal_sols = optimize_ip_form!(algo, getoptimizer(form, optimizer_id), form, result) partial_sol = nothing partial_sol_value = 0.0 diff --git a/src/Algorithm/basic/solvelpform.jl b/src/Algorithm/basic/solvelpform.jl index 4b335aab6..f998318b6 100644 --- a/src/Algorithm/basic/solvelpform.jl +++ b/src/Algorithm/basic/solvelpform.jl @@ -53,7 +53,7 @@ end function run!( algo::SolveLpForm, env::Env, form::Formulation, input::OptimizationInput, - solver_id::Int = 1 + optimizer_id::Int = 1 )::OptimizationOutput result = OptimizationState(form) @@ -71,7 +71,7 @@ function run!( partial_sol_val = getvalue(partial_sol) end - optimizer = getoptimizer(form, solver_id) + optimizer = getoptimizer(form, optimizer_id) optimize_lp_form!(algo, optimizer, form, result) primal_sols = get_primal_solutions(form, optimizer) diff --git a/src/Algorithm/colgen.jl b/src/Algorithm/colgen.jl index d55813b5a..5c31e9acb 100644 --- a/src/Algorithm/colgen.jl +++ b/src/Algorithm/colgen.jl @@ -19,7 +19,7 @@ restricted master and `pricing_prob_solve_alg` to solve the subproblems. """ @with_kw struct ColumnGeneration <: AbstractOptimizationAlgorithm restr_master_solve_alg = SolveLpForm(get_dual_solution=true) - restr_master_solver_id = 1 + restr_master_optimizer_id = 1 # TODO : pricing problem solver may be different depending on the # pricing subproblem pricing_prob_solve_alg = DefaultPricing() @@ -419,7 +419,7 @@ function cleanup_columns(algo::ColumnGeneration, iteration::Int64, master::Formu iteration % 10 != 0 && return cols_with_redcost = Vector{Pair{Variable,Float64}}() - optimizer = getoptimizer(master, algo.restr_master_solver_id) + optimizer = getoptimizer(master, algo.restr_master_optimizer_id) for (id, var) in getvars(master) if getduty(id) <= MasterCol && iscuractive(master, var) && isexplicit(master, var) push!(cols_with_redcost, var => getreducedcost(master, optimizer, var)) @@ -613,7 +613,7 @@ function cg_main_loop!( rm_input = OptimizationInput( OptimizationState(masterform, ip_primal_bound=get_ip_primal_bound(cg_optstate)) ) - rm_output = run!(algo.restr_master_solve_alg, env, masterform, rm_input, algo.restr_master_solver_id) + rm_output = run!(algo.restr_master_solve_alg, env, masterform, rm_input, algo.restr_master_optimizer_id) end rm_optstate = getoptstate(rm_output) diff --git a/src/Algorithm/pricing.jl b/src/Algorithm/pricing.jl index 7ba292016..dab66ad4e 100644 --- a/src/Algorithm/pricing.jl +++ b/src/Algorithm/pricing.jl @@ -1,7 +1,7 @@ @with_kw struct DefaultPricing <: AbstractOptimizationAlgorithm pricing_callback::PricingCallback = PricingCallback() solve_ip_form::SolveIpForm = SolveIpForm(deactivate_artificial_vars=false, enforce_integrality=false, log_level=2) - solver_id::Int = 1 + optimizer_id::Int = 1 end _child_algorithm(algo::DefaultPricing, ::MoiOptimizer) = algo.solve_ip_form @@ -10,7 +10,7 @@ _child_algorithm(::DefaultPricing, ::NoOptimizer) = nothing function get_child_algorithms(algo::DefaultPricing, spform::Formulation{DwSp}) child_algs = Tuple{AbstractAlgorithm,AbstractModel}[] - opt = getoptimizer(spform, algo.solver_id) + opt = getoptimizer(spform, algo.optimizer_id) if _child_algorithm(algo, opt) !== nothing push!(child_algs, (_child_algorithm(algo, opt), spform)) end @@ -18,9 +18,9 @@ function get_child_algorithms(algo::DefaultPricing, spform::Formulation{DwSp}) end function run!(algo::DefaultPricing, env::Env, spform::Formulation{DwSp}, input::OptimizationInput)::OptimizationOutput - opt = getoptimizer(spform, algo.solver_id) + opt = getoptimizer(spform, algo.optimizer_id) if _child_algorithm(algo, opt) !== nothing - return run!(_child_algorithm(algo, opt), env, spform, input, algo.solver_id) + return run!(_child_algorithm(algo, opt), env, spform, input, algo.optimizer_id) end return error("Cannot optimize LP formulation with optimizer of type $(typeof(opt)).") end \ No newline at end of file diff --git a/test/pricing_callback_tests.jl b/test/pricing_callback_tests.jl index cd0129d2c..259e41c78 100644 --- a/test/pricing_callback_tests.jl +++ b/test/pricing_callback_tests.jl @@ -11,11 +11,11 @@ function pricing_callback_tests() conqueralg = ClA.ColCutGenConquer( stages = [ClA.ColumnGeneration( pricing_prob_solve_alg = ClA.DefaultPricing( - solver_id=2, pricing_callback = PricingCallback(stage=1) + optimizer_id=2, pricing_callback = PricingCallback(stage=1) )), ClA.ColumnGeneration( pricing_prob_solve_alg = ClA.DefaultPricing( - solver_id=2, pricing_callback = PricingCallback(stage=2) + optimizer_id=2, pricing_callback = PricingCallback(stage=2) )) ] ) From 9efcd7b8fdf196dfbb836d2aea933043f296336e Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Sun, 23 May 2021 15:59:44 +0200 Subject: [PATCH 03/13] add Manifest --- Manifest.toml | 434 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 434 insertions(+) create mode 100644 Manifest.toml diff --git a/Manifest.toml b/Manifest.toml new file mode 100644 index 000000000..c5f495db4 --- /dev/null +++ b/Manifest.toml @@ -0,0 +1,434 @@ +# This file is machine-generated - editing it directly is not advised + +[[ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" + +[[ArnoldiMethod]] +deps = ["LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "f87e559f87a45bece9c9ed97458d3afe98b1ebb9" +uuid = "ec485272-7323-5ecc-a04f-4719b315124d" +version = "0.1.0" + +[[Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Statistics", "UUIDs"] +git-tree-sha1 = "9e62e66db34540a0c919d72172cc2f642ac71260" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "0.5.0" + +[[BinaryProvider]] +deps = ["Libdl", "Logging", "SHA"] +git-tree-sha1 = "ecdec412a9abc8db54c0efc5548c64dfce072058" +uuid = "b99e7846-7c00-51b0-8f62-c81ae34c0232" +version = "0.5.10" + +[[BlockDecomposition]] +deps = ["JuMP", "MathOptInterface", "Test"] +path = "/Users/guimarqu/.julia/dev/BlockDecomposition" +uuid = "6cde8614-403a-11e9-12f1-c10d0f0caca0" +version = "1.3.0" + +[[Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c3598e525718abcc440f69cc6d5f60dda0a1b61e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.6+5" + +[[CEnum]] +git-tree-sha1 = "215a9aa4a1f23fbd05b92769fdd62559488d70e9" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.1" + +[[Calculus]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" +uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" +version = "0.5.1" + +[[ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "9b0375dc013ab0fc472b37cb8b18eed66b83f76b" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "0.9.43" + +[[CodecBzip2]] +deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"] +git-tree-sha1 = "2e62a725210ce3c3c2e1a3080190e7ca491f18d7" +uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" +version = "0.7.2" + +[[CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[ColunaDemos]] +deps = ["BlockDecomposition", "DelimitedFiles", "GLPK", "JuMP", "LightGraphs", "MathOptInterface"] +git-tree-sha1 = "5b72a43ed75502266f1e0bb3266f4401e383af4d" +repo-rev = "master" +repo-url = "git@github.com:atoptima/ColunaDemos.jl.git" +uuid = "a54e61d4-7723-11e9-2469-af255fcaa246" +version = "0.1.0" + +[[CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "0900bc19193b8e672d9cd477e6cd92d9e7c02f99" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.29.0" + +[[CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" + +[[DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "4437b64df1e0adccc3e5d1adbc3ac741095e4677" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.9" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[DiffResults]] +deps = ["StaticArrays"] +git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.0.3" + +[[DiffRules]] +deps = ["NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "214c3fcac57755cfda163d91c58893a8723f93e9" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.0.2" + +[[Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[DocStringExtensions]] +deps = ["LibGit2", "Markdown", "Pkg", "Test"] +git-tree-sha1 = "9d4f64f79012636741cf01133158a54b24924c32" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.8.4" + +[[Downloads]] +deps = ["ArgTools", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" + +[[DynamicSparseArrays]] +git-tree-sha1 = "0df939d04238dfbaf40463e6c062c2ba11fdd5ec" +repo-rev = "master" +repo-url = "https://github.com/atoptima/DynamicSparseArrays.jl.git" +uuid = "8086fd22-9a0c-46a5-a6c8-6e24676501fe" +version = "0.5.0" + +[[ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "NaNMath", "Printf", "Random", "SpecialFunctions", "StaticArrays"] +git-tree-sha1 = "e2af66012e08966366a43251e1fd421522908be6" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.18" + +[[GLPK]] +deps = ["BinaryProvider", "CEnum", "GLPK_jll", "Libdl", "MathOptInterface"] +git-tree-sha1 = "d2539170674009054d96af7758c486a2e0e4f501" +uuid = "60bf3e95-4087-53dc-ae20-288a0d20c6a6" +version = "0.14.8" + +[[GLPK_jll]] +deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "01de09b070d4b8e3e1250c6542e16ed5cad45321" +uuid = "e8aa6df9-e6ca-548a-97ff-1f85fc5b8b98" +version = "5.0.0+0" + +[[GMP_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d" + +[[HTTP]] +deps = ["Base64", "Dates", "IniFile", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] +git-tree-sha1 = "b855bf8247d6e946c75bb30f593bfe7fe591058d" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "0.9.8" + +[[Inflate]] +git-tree-sha1 = "f5fc07d4e706b84f72d54eedcc1c13d92fb0871c" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.2" + +[[IniFile]] +deps = ["Test"] +git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.0" + +[[InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "642a199af8b68253517b80bd3bfd17eb4e84df6e" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.3.0" + +[[JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "81690084b6198a2e1da36fcfda16eeca9f9f24e4" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.1" + +[[JSONSchema]] +deps = ["HTTP", "JSON", "ZipFile"] +git-tree-sha1 = "b84ab8139afde82c7c65ba2b792fe12e01dd7307" +uuid = "7d188eb4-7ad8-530c-ae41-71a32a6d4692" +version = "0.3.3" + +[[JuMP]] +deps = ["Calculus", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MathOptInterface", "MutableArithmetics", "NaNMath", "Printf", "Random", "SparseArrays", "SpecialFunctions", "Statistics"] +git-tree-sha1 = "8dfc5df8aad9f2cfebc8371b69700efd02060827" +uuid = "4076af6c-e467-56ae-b986-b466b2749572" +version = "0.21.8" + +[[LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + +[[LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + +[[LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[LightGraphs]] +deps = ["ArnoldiMethod", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "432428df5f360964040ed60418dd5601ecd240b6" +uuid = "093fc24a-ae57-5d10-9952-331d41423f4d" +version = "1.3.5" + +[[LinearAlgebra]] +deps = ["Libdl"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[LogExpFunctions]] +deps = ["DocStringExtensions", "LinearAlgebra"] +git-tree-sha1 = "ed26854d7c2c867d143f0e07c198fc9e8b721d10" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.2.3" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "6a8a2a625ab0dea913aba95c11370589e0239ff0" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.6" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[MathOptInterface]] +deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "JSON", "JSONSchema", "LinearAlgebra", "MutableArithmetics", "OrderedCollections", "SparseArrays", "Test", "Unicode"] +git-tree-sha1 = "606efe4246da5407d7505265a1ead72467528996" +uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" +version = "0.9.20" + +[[MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] +git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.0.3" + +[[MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" + +[[MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "ad9b2bce6021631e0e20706d361972343a03e642" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "0.2.19" + +[[NaNMath]] +git-tree-sha1 = "bfe47e760d60b82b66b61d2d44128b62e3a369fb" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "0.3.5" + +[[NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" + +[[OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b9b8b8ed236998f91143938a760c2112dceeb2b4" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.4+0" + +[[OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "2276ac65f1e236e0a6ea70baff3f62ad4c625345" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.2" + +[[Parsers]] +deps = ["Dates"] +git-tree-sha1 = "c8abc88faa3f7a3950832ac5d6e690881590d6dc" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "1.1.0" + +[[Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[Preferences]] +deps = ["TOML"] +git-tree-sha1 = "00cfd92944ca9c760982747e9a1d0d5d86ab1e5a" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.2.2" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "daf7aec3fe3acb2131388f93a4c409b8c7f62226" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.3" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[SpecialFunctions]] +deps = ["ChainRulesCore", "LogExpFunctions", "OpenSpecFun_jll"] +git-tree-sha1 = "9146da51b38e9705b9f5ccfadc3ab10a482cae36" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "1.4.0" + +[[StaticArrays]] +deps = ["LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "c635017268fd51ed944ec429bcc4ad010bcea900" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.2.0" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" + +[[Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[TimerOutputs]] +deps = ["Printf"] +git-tree-sha1 = "32cdbe6cd2d214c25a0b88f985c9e0092877c236" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.8" + +[[TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "7c53c35547de1c5b9d46a4797cf6d8253807108c" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.5" + +[[URIs]] +git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.3.0" + +[[UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[ZipFile]] +deps = ["Libdl", "Printf", "Zlib_jll"] +git-tree-sha1 = "c3a5637e27e914a7a445b8d0ad063d701931e9f7" +uuid = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" +version = "0.9.3" + +[[Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" + +[[nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" + +[[p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" From f0b378d4092ce87e8ccd12f3381f3c415cd3d300 Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Sun, 23 May 2021 16:04:20 +0200 Subject: [PATCH 04/13] update Manifest --- Manifest.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Manifest.toml b/Manifest.toml index c5f495db4..8f4d17c99 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -29,7 +29,9 @@ version = "0.5.10" [[BlockDecomposition]] deps = ["JuMP", "MathOptInterface", "Test"] -path = "/Users/guimarqu/.julia/dev/BlockDecomposition" +git-tree-sha1 = "045eeefd32419b34cabbe12aedbdc28581364153" +repo-rev = "master" +repo-url = "https://github.com/atoptima/BlockDecomposition.jl.git" uuid = "6cde8614-403a-11e9-12f1-c10d0f0caca0" version = "1.3.0" From 5b51b5b127840010b74813a768e4190d8e4c9024 Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Sun, 23 May 2021 16:10:28 +0200 Subject: [PATCH 05/13] remove Manifest because does not work --- Manifest.toml | 436 -------------------------------------------------- 1 file changed, 436 deletions(-) delete mode 100644 Manifest.toml diff --git a/Manifest.toml b/Manifest.toml deleted file mode 100644 index 8f4d17c99..000000000 --- a/Manifest.toml +++ /dev/null @@ -1,436 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -[[ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" - -[[ArnoldiMethod]] -deps = ["LinearAlgebra", "Random", "StaticArrays"] -git-tree-sha1 = "f87e559f87a45bece9c9ed97458d3afe98b1ebb9" -uuid = "ec485272-7323-5ecc-a04f-4719b315124d" -version = "0.1.0" - -[[Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" - -[[Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[BenchmarkTools]] -deps = ["JSON", "Logging", "Printf", "Statistics", "UUIDs"] -git-tree-sha1 = "9e62e66db34540a0c919d72172cc2f642ac71260" -uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" -version = "0.5.0" - -[[BinaryProvider]] -deps = ["Libdl", "Logging", "SHA"] -git-tree-sha1 = "ecdec412a9abc8db54c0efc5548c64dfce072058" -uuid = "b99e7846-7c00-51b0-8f62-c81ae34c0232" -version = "0.5.10" - -[[BlockDecomposition]] -deps = ["JuMP", "MathOptInterface", "Test"] -git-tree-sha1 = "045eeefd32419b34cabbe12aedbdc28581364153" -repo-rev = "master" -repo-url = "https://github.com/atoptima/BlockDecomposition.jl.git" -uuid = "6cde8614-403a-11e9-12f1-c10d0f0caca0" -version = "1.3.0" - -[[Bzip2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "c3598e525718abcc440f69cc6d5f60dda0a1b61e" -uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.6+5" - -[[CEnum]] -git-tree-sha1 = "215a9aa4a1f23fbd05b92769fdd62559488d70e9" -uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" -version = "0.4.1" - -[[Calculus]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" -uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" -version = "0.5.1" - -[[ChainRulesCore]] -deps = ["Compat", "LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "9b0375dc013ab0fc472b37cb8b18eed66b83f76b" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "0.9.43" - -[[CodecBzip2]] -deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"] -git-tree-sha1 = "2e62a725210ce3c3c2e1a3080190e7ca491f18d7" -uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" -version = "0.7.2" - -[[CodecZlib]] -deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" -uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.0" - -[[ColunaDemos]] -deps = ["BlockDecomposition", "DelimitedFiles", "GLPK", "JuMP", "LightGraphs", "MathOptInterface"] -git-tree-sha1 = "5b72a43ed75502266f1e0bb3266f4401e383af4d" -repo-rev = "master" -repo-url = "git@github.com:atoptima/ColunaDemos.jl.git" -uuid = "a54e61d4-7723-11e9-2469-af255fcaa246" -version = "0.1.0" - -[[CommonSubexpressions]] -deps = ["MacroTools", "Test"] -git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" -uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" -version = "0.3.0" - -[[Compat]] -deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] -git-tree-sha1 = "0900bc19193b8e672d9cd477e6cd92d9e7c02f99" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "3.29.0" - -[[CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" - -[[DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "4437b64df1e0adccc3e5d1adbc3ac741095e4677" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.9" - -[[Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" - -[[DelimitedFiles]] -deps = ["Mmap"] -uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" - -[[DiffResults]] -deps = ["StaticArrays"] -git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" -uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" -version = "1.0.3" - -[[DiffRules]] -deps = ["NaNMath", "Random", "SpecialFunctions"] -git-tree-sha1 = "214c3fcac57755cfda163d91c58893a8723f93e9" -uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" -version = "1.0.2" - -[[Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[DocStringExtensions]] -deps = ["LibGit2", "Markdown", "Pkg", "Test"] -git-tree-sha1 = "9d4f64f79012636741cf01133158a54b24924c32" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.8.4" - -[[Downloads]] -deps = ["ArgTools", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" - -[[DynamicSparseArrays]] -git-tree-sha1 = "0df939d04238dfbaf40463e6c062c2ba11fdd5ec" -repo-rev = "master" -repo-url = "https://github.com/atoptima/DynamicSparseArrays.jl.git" -uuid = "8086fd22-9a0c-46a5-a6c8-6e24676501fe" -version = "0.5.0" - -[[ForwardDiff]] -deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "NaNMath", "Printf", "Random", "SpecialFunctions", "StaticArrays"] -git-tree-sha1 = "e2af66012e08966366a43251e1fd421522908be6" -uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.18" - -[[GLPK]] -deps = ["BinaryProvider", "CEnum", "GLPK_jll", "Libdl", "MathOptInterface"] -git-tree-sha1 = "d2539170674009054d96af7758c486a2e0e4f501" -uuid = "60bf3e95-4087-53dc-ae20-288a0d20c6a6" -version = "0.14.8" - -[[GLPK_jll]] -deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "01de09b070d4b8e3e1250c6542e16ed5cad45321" -uuid = "e8aa6df9-e6ca-548a-97ff-1f85fc5b8b98" -version = "5.0.0+0" - -[[GMP_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d" - -[[HTTP]] -deps = ["Base64", "Dates", "IniFile", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] -git-tree-sha1 = "b855bf8247d6e946c75bb30f593bfe7fe591058d" -uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "0.9.8" - -[[Inflate]] -git-tree-sha1 = "f5fc07d4e706b84f72d54eedcc1c13d92fb0871c" -uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.2" - -[[IniFile]] -deps = ["Test"] -git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" -uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" -version = "0.5.0" - -[[InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[JLLWrappers]] -deps = ["Preferences"] -git-tree-sha1 = "642a199af8b68253517b80bd3bfd17eb4e84df6e" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.3.0" - -[[JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "81690084b6198a2e1da36fcfda16eeca9f9f24e4" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.1" - -[[JSONSchema]] -deps = ["HTTP", "JSON", "ZipFile"] -git-tree-sha1 = "b84ab8139afde82c7c65ba2b792fe12e01dd7307" -uuid = "7d188eb4-7ad8-530c-ae41-71a32a6d4692" -version = "0.3.3" - -[[JuMP]] -deps = ["Calculus", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MathOptInterface", "MutableArithmetics", "NaNMath", "Printf", "Random", "SparseArrays", "SpecialFunctions", "Statistics"] -git-tree-sha1 = "8dfc5df8aad9f2cfebc8371b69700efd02060827" -uuid = "4076af6c-e467-56ae-b986-b466b2749572" -version = "0.21.8" - -[[LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" - -[[LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" - -[[LibGit2]] -deps = ["Base64", "NetworkOptions", "Printf", "SHA"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" - -[[LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" - -[[Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[LightGraphs]] -deps = ["ArnoldiMethod", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "432428df5f360964040ed60418dd5601ecd240b6" -uuid = "093fc24a-ae57-5d10-9952-331d41423f4d" -version = "1.3.5" - -[[LinearAlgebra]] -deps = ["Libdl"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - -[[LogExpFunctions]] -deps = ["DocStringExtensions", "LinearAlgebra"] -git-tree-sha1 = "ed26854d7c2c867d143f0e07c198fc9e8b721d10" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.2.3" - -[[Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "6a8a2a625ab0dea913aba95c11370589e0239ff0" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.6" - -[[Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[MathOptInterface]] -deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "JSON", "JSONSchema", "LinearAlgebra", "MutableArithmetics", "OrderedCollections", "SparseArrays", "Test", "Unicode"] -git-tree-sha1 = "606efe4246da5407d7505265a1ead72467528996" -uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" -version = "0.9.20" - -[[MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] -git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" -uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.0.3" - -[[MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" - -[[Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" - -[[MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" - -[[MutableArithmetics]] -deps = ["LinearAlgebra", "SparseArrays", "Test"] -git-tree-sha1 = "ad9b2bce6021631e0e20706d361972343a03e642" -uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" -version = "0.2.19" - -[[NaNMath]] -git-tree-sha1 = "bfe47e760d60b82b66b61d2d44128b62e3a369fb" -uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "0.3.5" - -[[NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" - -[[OpenSpecFun_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "b9b8b8ed236998f91143938a760c2112dceeb2b4" -uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" -version = "0.5.4+0" - -[[OrderedCollections]] -git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.4.1" - -[[Parameters]] -deps = ["OrderedCollections", "UnPack"] -git-tree-sha1 = "2276ac65f1e236e0a6ea70baff3f62ad4c625345" -uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" -version = "0.12.2" - -[[Parsers]] -deps = ["Dates"] -git-tree-sha1 = "c8abc88faa3f7a3950832ac5d6e690881590d6dc" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "1.1.0" - -[[Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" - -[[Preferences]] -deps = ["TOML"] -git-tree-sha1 = "00cfd92944ca9c760982747e9a1d0d5d86ab1e5a" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.2.2" - -[[Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[Random]] -deps = ["Serialization"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" - -[[Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" - -[[SimpleTraits]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "daf7aec3fe3acb2131388f93a4c409b8c7f62226" -uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.3" - -[[Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[SparseArrays]] -deps = ["LinearAlgebra", "Random"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - -[[SpecialFunctions]] -deps = ["ChainRulesCore", "LogExpFunctions", "OpenSpecFun_jll"] -git-tree-sha1 = "9146da51b38e9705b9f5ccfadc3ab10a482cae36" -uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "1.4.0" - -[[StaticArrays]] -deps = ["LinearAlgebra", "Random", "Statistics"] -git-tree-sha1 = "c635017268fd51ed944ec429bcc4ad010bcea900" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.2.0" - -[[Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" - -[[TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" - -[[Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" - -[[Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[TimerOutputs]] -deps = ["Printf"] -git-tree-sha1 = "32cdbe6cd2d214c25a0b88f985c9e0092877c236" -uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" -version = "0.5.8" - -[[TranscodingStreams]] -deps = ["Random", "Test"] -git-tree-sha1 = "7c53c35547de1c5b9d46a4797cf6d8253807108c" -uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.9.5" - -[[URIs]] -git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.3.0" - -[[UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" - -[[UnPack]] -git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" -uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" -version = "1.0.2" - -[[Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" - -[[ZipFile]] -deps = ["Libdl", "Printf", "Zlib_jll"] -git-tree-sha1 = "c3a5637e27e914a7a445b8d0ad063d701931e9f7" -uuid = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" -version = "0.9.3" - -[[Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" - -[[nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" - -[[p7zip_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" From 423149a6047a9bb3dc1cfb37de7724aa45249e03 Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Tue, 25 May 2021 17:25:58 +0200 Subject: [PATCH 06/13] changes --- src/Algorithm/Algorithm.jl | 5 +- src/Algorithm/basic/pricingcallback.jl | 53 ------ src/Algorithm/basic/solveipform.jl | 215 ++++++++++++++++++------- src/Algorithm/basic/solvelpform.jl | 36 +++++ src/Algorithm/colgen.jl | 4 +- src/Algorithm/conquer.jl | 2 +- src/Algorithm/pricing.jl | 26 --- src/decomposition.jl | 1 - test/full_instances_tests.jl | 2 +- test/pricing_callback_tests.jl | 8 +- 10 files changed, 203 insertions(+), 149 deletions(-) diff --git a/src/Algorithm/Algorithm.jl b/src/Algorithm/Algorithm.jl index db1a1aa8e..197a6c5fd 100644 --- a/src/Algorithm/Algorithm.jl +++ b/src/Algorithm/Algorithm.jl @@ -31,10 +31,9 @@ include("formstorages.jl") include("interface.jl") # Basic algorithms -include("basic/solveipform.jl") include("basic/solvelpform.jl") +include("basic/solveipform.jl") include("basic/cutcallback.jl") -include("basic/pricingcallback.jl") # Child algorithms used by conquer algorithms include("pricing.jl") @@ -72,7 +71,7 @@ export getterminationstatus, setterminationstatus!, # Algorithm's types export AbstractOptimizationAlgorithm, TreeSearchAlgorithm, ColCutGenConquer, ColumnGeneration, - DefaultPricing, PricingCallback, BendersConquer, BendersCutGeneration, SolveIpForm, + BendersConquer, BendersCutGeneration, SolveIpForm, MoiOptimize, UserOptimizer, SolveLpForm, ExactBranchingPhase, OnlyRestrictedMasterBranchingPhase, PreprocessAlgorithm, RestrictedMasterIPHeuristic, OptimizationInput, OptimizationOutput, OptimizationState, EmptyInput diff --git a/src/Algorithm/basic/pricingcallback.jl b/src/Algorithm/basic/pricingcallback.jl index 018a62dc8..e69de29bb 100644 --- a/src/Algorithm/basic/pricingcallback.jl +++ b/src/Algorithm/basic/pricingcallback.jl @@ -1,53 +0,0 @@ -""" -todo -""" -@with_kw struct PricingCallback <: AbstractOptimizationAlgorithm - stage::Int = 1 # stage 1 is the exact stage by convention, - # any other stage is heuristic - max_nb_ip_primal_sols = 50 -end - -function get_units_usage(algo::PricingCallback, spform::Formulation{DwSp}) - units_usage = Tuple{AbstractModel, UnitType, UnitAccessMode}[] - push!(units_usage, (spform, StaticVarConstrUnit, READ_ONLY)) - return units_usage -end - -function run!( - algo::PricingCallback, env::Env, spform::Formulation{DwSp}, input::OptimizationInput, - optimizer_id::Int = 1 -)::OptimizationOutput - result = OptimizationState( - spform, - ip_primal_bound = get_ip_primal_bound(getoptstate(input)), - max_length_ip_primal_sols = algo.max_nb_ip_primal_sols - ) - - @logmsg LogLevel(-2) "Calling user-defined optimization function." - - optimizer = getoptimizer(spform, optimizer_id) - cbdata = MathProg.PricingCallbackData(spform, algo.stage) - optimizer.user_oracle(cbdata) - - if length(cbdata.primal_solutions) > 0 - for primal_sol in cbdata.primal_solutions - add_ip_primal_sol!(result, primal_sol) - end - - if algo.stage == 1 # stage 1 is exact by convention - dual_bound = getvalue(get_ip_primal_bound(result)) - set_ip_dual_bound!(result, DualBound(spform, dual_bound)) - setterminationstatus!(result, OPTIMAL) - else - setterminationstatus!(result, OTHER_LIMIT) - end - else - if algo.stage == 1 - setterminationstatus!(result, INFEASIBLE) - else - setterminationstatus!(result, OTHER_LIMIT) - end - end - - return OptimizationOutput(result) -end diff --git a/src/Algorithm/basic/solveipform.jl b/src/Algorithm/basic/solveipform.jl index ce6753c81..6113aa6ae 100644 --- a/src/Algorithm/basic/solveipform.jl +++ b/src/Algorithm/basic/solveipform.jl @@ -1,29 +1,114 @@ +################################################################################ +# Parameters for each type of optimizer +################################################################################ +""" + MoiOptimize( + time_limit = 600 + deactivate_artificial_vars = false + enforce_integrality = false + get_dual_bound = true + ) + +User parameters for an optimizer that calls a subsolver through MathOptInterface. +""" +@with_kw struct MoiOptimize + time_limit::Int = 600 + deactivate_artificial_vars::Bool = true + enforce_integrality::Bool = true + get_dual_bound::Bool = true + max_nb_ip_primal_sols::Int = 50 + log_level::Int = -1 + silent::Bool = true +end + +""" + UserOptimize( + stage = 1 + max_nb_ip_primal_sols = 50 + ) + +User parameters for an optimizer that calls a callback to solve the problem. +""" +@with_kw struct UserOptimize + stage::Int = 1 + max_nb_ip_primal_sols::Int = 50 +end + +""" + CustomOptimize() + +User parameters for an optimizer that calls a custom solver to solve a custom model. +""" +struct CustomOptimize end + +################################################################################ +# Algorithm +################################################################################ """ Coluna.Algorithm.SolveIpForm( - time_limit::Int = 600, - deactivate_artificial_vars = true, - enforce_integrality = true, - silent = true, - max_nb_ip_primal_sols = 50, - log_level = 0 + optimizer_id = 1 + moi_params = MoiOptimize() + user_params = UserOptimize() + custom_params = CustomOptimize() ) -Solve a mixed integer linear program. +Solve an optimization problem. It can call a : +- subsolver through MathOptInterface to optimize a mixed integer program +- pricing callback defined by the user +- custom optimizer to solve a custom model + +The algorithms calls optimizer with id `optimizer_id`. +The user can specify different optimizers using the method `BlockDecomposition.specify!`. +In that case `optimizer_id` is the position of the optimizer in the array of optimizers +passed to `specify!`. +By default, the algorihm uses the first optimizer or the default optimizer if no +optimizer has been specified. + +Depending on the type of the optimizer chosen, the algorithm will use one the +three configurations : `moi_params`, `user_params`, or `custom_params`. """ @with_kw struct SolveIpForm <: AbstractOptimizationAlgorithm - time_limit::Int = 600 - deactivate_artificial_vars = true - enforce_integrality = true - get_dual_bound = true - silent = true - max_nb_ip_primal_sols = 50 - log_level = 0 + optimizer_id::Int = 1 + moi_params::MoiOptimize = MoiOptimize() + user_params::UserOptimize = UserOptimize() + custom_params::CustomOptimize = CustomOptimize() end # SolveIpForm does not have child algorithms, therefore get_child_algorithms() is not defined +# Dispatch on the type of the optimizer to return the parameters +_optimizer_params(algo::SolveIpForm, ::MoiOptimizer) = algo.moi_params +_optimizer_params(algo::SolveIpForm, ::UserOptimizer) = algo.user_params +# TODO : custom optimizer +_optimizer_params(::SolveIpForm, ::NoOptimizer) = nothing + +function run!(algo::SolveIpForm, env::Env, form::Formulation, input::OptimizationInput)::OptimizationOutput + opt = getoptimizer(form, algo.optimizer_id) + params = _optimizer_params(algo, opt) + if params !== nothing + return run!(params, env, form, input; optimizer_id = algo.optimizer_id) + end + return error("Cannot optimize formulation with optimizer of type $(typeof(opt)).") +end + +run!(algo::SolveIpForm, env::Env, reform::Reformulation, input::OptimizationInput) = + run!(algo, env, getmaster(reform), input) + +################################################################################ +# Get units usage (depends on the type of the optimizer) +################################################################################ +function get_units_usage(algo::SolveIpForm, form::Formulation) + opt = getoptimizer(form, algo.optimizer_id) + params = _optimizer_params(algo, opt) + if params !== nothing + return get_units_usage(params, form) + end + return error("Cannot get units usage of optimizer of type $(typeof(opt)).") +end + +# get_units_usage of MoiOptimize function get_units_usage( - algo::SolveIpForm, form::Formulation{Duty} + ::MoiOptimize, form::Formulation{Duty} ) where {Duty<:MathProg.AbstractFormDuty} # we use storage units in the read only mode, as all modifications # (deactivating artificial vars and enforcing integrality) @@ -40,17 +125,31 @@ function get_units_usage( return units_usage end -get_units_usage(algo::SolveIpForm, reform::Reformulation) = +get_units_usage(algo::SolveIpForm, reform::Reformulation) = get_units_usage(algo, getmaster(reform)) +# get_units_usage of UserOptimize +function get_units_usage(::UserOptimize, spform::Formulation{DwSp}) + units_usage = Tuple{AbstractModel, UnitType, UnitAccessMode}[] + push!(units_usage, (spform, StaticVarConstrUnit, READ_ONLY)) + return units_usage +end + +# TODO : get_units_usage of CustomOptimize + +################################################################################ +# run! methods (depends on the type of the optimizer) +################################################################################ + function check_if_optimizer_supports_ip(optimizer::MoiOptimizer) return MOI.supports_constraint(optimizer.inner, MOI.SingleVariable, MOI.Integer) end check_if_optimizer_supports_ip(optimizer::UserOptimizer) = false check_if_optimizer_supports_ip(optimizer::NoOptimizer) = false +# run! of MoiOptimize function run!( - algo::SolveIpForm, env::Env, form::Formulation, input::OptimizationInput, + algo::MoiOptimize, ::Env, form::Formulation, input::OptimizationInput; optimizer_id::Int = 1 )::OptimizationOutput result = OptimizationState( @@ -76,7 +175,7 @@ function run!( partial_sol = get_primal_solution(partsolunit, form) partial_sol_value = getvalue(partial_sol) end - + if length(primal_sols) > 0 if partial_sol !== nothing for primal_sol in primal_sols @@ -107,47 +206,8 @@ function run!( return OptimizationOutput(result) end -run!(algo::SolveIpForm, env::Env, reform::Reformulation, input::OptimizationInput) = - run!(algo, env, getmaster(reform), input) - -function termination_status!(result::OptimizationState, optimizer::MoiOptimizer) - terminationstatus = MOI.get(getinner(optimizer), MOI.TerminationStatus()) - if terminationstatus != MOI.INFEASIBLE && - terminationstatus != MOI.DUAL_INFEASIBLE && - terminationstatus != MOI.INFEASIBLE_OR_UNBOUNDED && - terminationstatus != MOI.OPTIMIZE_NOT_CALLED && - terminationstatus != MOI.INVALID_MODEL && - terminationstatus != MOI.TIME_LIMIT - - setterminationstatus!(result, convert_status(terminationstatus)) - - if MOI.get(getinner(optimizer), MOI.ResultCount()) <= 0 - msg = """ - Termination status = $(terminationstatus) but no results. - Please, open an issue at https://github.com/atoptima/Coluna.jl/issues - """ - error(msg) - end - else - @warn "Solver has no result to show." - setterminationstatus!(result, INFEASIBLE) - end - return -end - -function optimize_with_moi!(optimizer::MoiOptimizer, form::Formulation, result::OptimizationState) - sync_solver!(optimizer, form) - nbvars = MOI.get(optimizer.inner, MOI.NumberOfVariables()) - if nbvars <= 0 - @warn "No variable in the formulation." - end - MOI.optimize!(getinner(optimizer)) - termination_status!(result, optimizer) - return -end - function optimize_ip_form!( - algo::SolveIpForm, optimizer::MoiOptimizer, form::Formulation, result::OptimizationState + algo::MoiOptimize, optimizer::MoiOptimizer, form::Formulation, result::OptimizationState ) MOI.set(optimizer.inner, MOI.TimeLimitSec(), algo.time_limit) MOI.set(optimizer.inner, MOI.Silent(), algo.silent) @@ -172,3 +232,42 @@ function optimize_ip_form!( end return primal_sols end + +# run! of UserOptimize +function run!( + algo::UserOptimize, ::Env, spform::Formulation{DwSp}, input::OptimizationInput; + optimizer_id::Int = 1 +)::OptimizationOutput + result = OptimizationState( + spform, + ip_primal_bound = get_ip_primal_bound(getoptstate(input)), + max_length_ip_primal_sols = algo.max_nb_ip_primal_sols + ) + + optimizer = getoptimizer(spform, optimizer_id) + cbdata = MathProg.PricingCallbackData(spform, algo.stage) + optimizer.user_oracle(cbdata) + + if length(cbdata.primal_solutions) > 0 + for primal_sol in cbdata.primal_solutions + add_ip_primal_sol!(result, primal_sol) + end + + if algo.stage == 1 # stage 1 is exact by convention + dual_bound = getvalue(get_ip_primal_bound(result)) + set_ip_dual_bound!(result, DualBound(spform, dual_bound)) + setterminationstatus!(result, OPTIMAL) + else + setterminationstatus!(result, OTHER_LIMIT) + end + else + if algo.stage == 1 + setterminationstatus!(result, INFEASIBLE) + else + setterminationstatus!(result, OTHER_LIMIT) + end + end + return OptimizationOutput(result) +end + +# TODO : run! of CustomOptimize \ No newline at end of file diff --git a/src/Algorithm/basic/solvelpform.jl b/src/Algorithm/basic/solvelpform.jl index f998318b6..2709c18a0 100644 --- a/src/Algorithm/basic/solvelpform.jl +++ b/src/Algorithm/basic/solvelpform.jl @@ -39,6 +39,42 @@ function get_units_usage( return units_usage end +function termination_status!(result::OptimizationState, optimizer::MoiOptimizer) + terminationstatus = MOI.get(getinner(optimizer), MOI.TerminationStatus()) + if terminationstatus != MOI.INFEASIBLE && + terminationstatus != MOI.DUAL_INFEASIBLE && + terminationstatus != MOI.INFEASIBLE_OR_UNBOUNDED && + terminationstatus != MOI.OPTIMIZE_NOT_CALLED && + terminationstatus != MOI.INVALID_MODEL && + terminationstatus != MOI.TIME_LIMIT + + setterminationstatus!(result, convert_status(terminationstatus)) + + if MOI.get(getinner(optimizer), MOI.ResultCount()) <= 0 + msg = """ + Termination status = $(terminationstatus) but no results. + Please, open an issue at https://github.com/atoptima/Coluna.jl/issues + """ + error(msg) + end + else + @warn "Solver has no result to show." + setterminationstatus!(result, INFEASIBLE) + end + return +end + +function optimize_with_moi!(optimizer::MoiOptimizer, form::Formulation, result::OptimizationState) + sync_solver!(optimizer, form) + nbvars = MOI.get(optimizer.inner, MOI.NumberOfVariables()) + if nbvars <= 0 + @warn "No variable in the formulation." + end + MOI.optimize!(getinner(optimizer)) + termination_status!(result, optimizer) + return +end + function optimize_lp_form!(::SolveLpForm, optimizer, ::Formulation, ::OptimizationState) # fallback error("Cannot optimize LP formulation with optimizer of type ", typeof(optimizer), ".") end diff --git a/src/Algorithm/colgen.jl b/src/Algorithm/colgen.jl index 5c31e9acb..2dc225182 100644 --- a/src/Algorithm/colgen.jl +++ b/src/Algorithm/colgen.jl @@ -1,7 +1,7 @@ """ Coluna.Algorithm.ColumnGeneration( restr_master_solve_alg = SolveLpForm(get_dual_solution = true) - pricing_prob_solve_alg = DefaultPricing(), + pricing_prob_solve_alg = SolveIpForm(), essential_cut_gen_alg = CutCallbacks(call_robust_facultative = false) max_nb_iterations::Int = 1000 log_print_frequency::Int = 1 @@ -22,7 +22,7 @@ restricted master and `pricing_prob_solve_alg` to solve the subproblems. restr_master_optimizer_id = 1 # TODO : pricing problem solver may be different depending on the # pricing subproblem - pricing_prob_solve_alg = DefaultPricing() + pricing_prob_solve_alg = SolveIpForm() essential_cut_gen_alg = CutCallbacks(call_robust_facultative=false) max_nb_iterations::Int64 = 1000 log_print_frequency::Int64 = 1 diff --git a/src/Algorithm/conquer.jl b/src/Algorithm/conquer.jl index 768a440a6..24d0ae172 100644 --- a/src/Algorithm/conquer.jl +++ b/src/Algorithm/conquer.jl @@ -69,7 +69,7 @@ end # ParameterisedHeuristic #################################################################### -RestrictedMasterIPHeuristic() = SolveIpForm(get_dual_bound = false) +RestrictedMasterIPHeuristic() = SolveIpForm(moi_params = MoiOptimize(get_dual_bound = false)) struct ParameterisedHeuristic algorithm::AbstractOptimizationAlgorithm diff --git a/src/Algorithm/pricing.jl b/src/Algorithm/pricing.jl index dab66ad4e..e69de29bb 100644 --- a/src/Algorithm/pricing.jl +++ b/src/Algorithm/pricing.jl @@ -1,26 +0,0 @@ -@with_kw struct DefaultPricing <: AbstractOptimizationAlgorithm - pricing_callback::PricingCallback = PricingCallback() - solve_ip_form::SolveIpForm = SolveIpForm(deactivate_artificial_vars=false, enforce_integrality=false, log_level=2) - optimizer_id::Int = 1 -end - -_child_algorithm(algo::DefaultPricing, ::MoiOptimizer) = algo.solve_ip_form -_child_algorithm(algo::DefaultPricing, ::UserOptimizer) = algo.pricing_callback -_child_algorithm(::DefaultPricing, ::NoOptimizer) = nothing - -function get_child_algorithms(algo::DefaultPricing, spform::Formulation{DwSp}) - child_algs = Tuple{AbstractAlgorithm,AbstractModel}[] - opt = getoptimizer(spform, algo.optimizer_id) - if _child_algorithm(algo, opt) !== nothing - push!(child_algs, (_child_algorithm(algo, opt), spform)) - end - return child_algs -end - -function run!(algo::DefaultPricing, env::Env, spform::Formulation{DwSp}, input::OptimizationInput)::OptimizationOutput - opt = getoptimizer(spform, algo.optimizer_id) - if _child_algorithm(algo, opt) !== nothing - return run!(_child_algorithm(algo, opt), env, spform, input, algo.optimizer_id) - end - return error("Cannot optimize LP formulation with optimizer of type $(typeof(opt)).") -end \ No newline at end of file diff --git a/src/decomposition.jl b/src/decomposition.jl index c6a1f1e1c..aa1542d45 100644 --- a/src/decomposition.jl +++ b/src/decomposition.jl @@ -430,7 +430,6 @@ _optimizerbuilder(opt::MOI.AbstractOptimizer) = () -> MoiOptimizer(opt) function getoptimizerbuilders(prob::Problem, ann::BD.Annotation) optimizers = BD.getoptimizerbuilders(ann) - if length(optimizers) > 0 return map(o -> _optimizerbuilder(o), optimizers) end diff --git a/test/full_instances_tests.jl b/test/full_instances_tests.jl index 2c0ebd8f8..6bbf48175 100644 --- a/test/full_instances_tests.jl +++ b/test/full_instances_tests.jl @@ -271,7 +271,7 @@ function generalized_assignment_tests() try JuMP.optimize!(problem) catch e - @test repr(e) == "ErrorException(\"Cannot optimize LP formulation with optimizer of type Coluna.MathProg.NoOptimizer.\")" + @test e isa ErrorException end end diff --git a/test/pricing_callback_tests.jl b/test/pricing_callback_tests.jl index 259e41c78..de2e442f5 100644 --- a/test/pricing_callback_tests.jl +++ b/test/pricing_callback_tests.jl @@ -10,12 +10,12 @@ function pricing_callback_tests() solver = ClA.TreeSearchAlgorithm( conqueralg = ClA.ColCutGenConquer( stages = [ClA.ColumnGeneration( - pricing_prob_solve_alg = ClA.DefaultPricing( - optimizer_id=2, pricing_callback = PricingCallback(stage=1) + pricing_prob_solve_alg = ClA.SolveIpForm( + optimizer_id=2, user_params = ClA.UserOptimize(stage=1) )), ClA.ColumnGeneration( - pricing_prob_solve_alg = ClA.DefaultPricing( - optimizer_id=2, pricing_callback = PricingCallback(stage=2) + pricing_prob_solve_alg = ClA.SolveIpForm( + optimizer_id=2, user_params = ClA.UserOptimize(stage=2) )) ] ) From e98ef151f71c6daf2a4ced20dfdce269bfb7d99f Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Tue, 25 May 2021 18:45:00 +0200 Subject: [PATCH 07/13] rm files --- src/Algorithm/Algorithm.jl | 1 - src/Algorithm/basic/pricingcallback.jl | 0 src/Algorithm/pricing.jl | 0 3 files changed, 1 deletion(-) delete mode 100644 src/Algorithm/basic/pricingcallback.jl delete mode 100644 src/Algorithm/pricing.jl diff --git a/src/Algorithm/Algorithm.jl b/src/Algorithm/Algorithm.jl index 197a6c5fd..141cc1016 100644 --- a/src/Algorithm/Algorithm.jl +++ b/src/Algorithm/Algorithm.jl @@ -36,7 +36,6 @@ include("basic/solveipform.jl") include("basic/cutcallback.jl") # Child algorithms used by conquer algorithms -include("pricing.jl") include("colgenstabilization.jl") include("colgen.jl") include("benders.jl") diff --git a/src/Algorithm/basic/pricingcallback.jl b/src/Algorithm/basic/pricingcallback.jl deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/Algorithm/pricing.jl b/src/Algorithm/pricing.jl deleted file mode 100644 index e69de29bb..000000000 From 288e8916374fbfc803117454926f1620441d2519 Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Tue, 25 May 2021 19:09:35 +0200 Subject: [PATCH 08/13] address Ruslan's comment --- src/Algorithm/basic/solveipform.jl | 2 +- src/Algorithm/colgen.jl | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Algorithm/basic/solveipform.jl b/src/Algorithm/basic/solveipform.jl index 6113aa6ae..f8784bccc 100644 --- a/src/Algorithm/basic/solveipform.jl +++ b/src/Algorithm/basic/solveipform.jl @@ -17,7 +17,7 @@ User parameters for an optimizer that calls a subsolver through MathOptInterface enforce_integrality::Bool = true get_dual_bound::Bool = true max_nb_ip_primal_sols::Int = 50 - log_level::Int = -1 + log_level::Int = 2 silent::Bool = true end diff --git a/src/Algorithm/colgen.jl b/src/Algorithm/colgen.jl index 2dc225182..1f1163757 100644 --- a/src/Algorithm/colgen.jl +++ b/src/Algorithm/colgen.jl @@ -1,7 +1,12 @@ """ Coluna.Algorithm.ColumnGeneration( restr_master_solve_alg = SolveLpForm(get_dual_solution = true) - pricing_prob_solve_alg = SolveIpForm(), + pricing_prob_solve_alg = SolveIpForm( + moi_params = MoiOptimize( + deactivate_artificial_vars = false, + enforce_integrality = false + ) + ) essential_cut_gen_alg = CutCallbacks(call_robust_facultative = false) max_nb_iterations::Int = 1000 log_print_frequency::Int = 1 @@ -22,7 +27,12 @@ restricted master and `pricing_prob_solve_alg` to solve the subproblems. restr_master_optimizer_id = 1 # TODO : pricing problem solver may be different depending on the # pricing subproblem - pricing_prob_solve_alg = SolveIpForm() + pricing_prob_solve_alg = SolveIpForm( + moi_params = MoiOptimize( + deactivate_artificial_vars = false, + enforce_integrality = false + ) + ) essential_cut_gen_alg = CutCallbacks(call_robust_facultative=false) max_nb_iterations::Int64 = 1000 log_print_frequency::Int64 = 1 From 38e5c6825673e8d87b1d69b015c33a246fcbd1dd Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Tue, 25 May 2021 21:43:52 +0200 Subject: [PATCH 09/13] Update src/MathProg/optimizerwrappers.jl Co-authored-by: Vitor Nesello --- src/MathProg/optimizerwrappers.jl | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/MathProg/optimizerwrappers.jl b/src/MathProg/optimizerwrappers.jl index e6b2793be..a8944417d 100644 --- a/src/MathProg/optimizerwrappers.jl +++ b/src/MathProg/optimizerwrappers.jl @@ -141,12 +141,9 @@ function initialize_optimizer!(optimizer::MoiOptimizer, form::Formulation) end initialize_optimizer!(optimizer, form::Formulation) = return - - function write_to_LP_file(form::Formulation, optimizer::MoiOptimizer, filename::String) src = getinner(optimizer) dest = MOI.FileFormats.Model(format = MOI.FileFormats.FORMAT_LP) MOI.copy_to(dest, src) MOI.write_to_file(dest, filename) end - From a1feee23c951f979b59ba152d8264143d02fae5a Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Wed, 26 May 2021 10:32:05 +0200 Subject: [PATCH 10/13] add Manifest --- Manifest.toml | 439 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 439 insertions(+) create mode 100644 Manifest.toml diff --git a/Manifest.toml b/Manifest.toml new file mode 100644 index 000000000..c6dec6976 --- /dev/null +++ b/Manifest.toml @@ -0,0 +1,439 @@ +# This file is machine-generated - editing it directly is not advised + +[[ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" + +[[ArnoldiMethod]] +deps = ["LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "f87e559f87a45bece9c9ed97458d3afe98b1ebb9" +uuid = "ec485272-7323-5ecc-a04f-4719b315124d" +version = "0.1.0" + +[[Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Statistics", "UUIDs"] +git-tree-sha1 = "01ca3823217f474243cc2c8e6e1d1f45956fe872" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.0.0" + +[[BinaryProvider]] +deps = ["Libdl", "Logging", "SHA"] +git-tree-sha1 = "ecdec412a9abc8db54c0efc5548c64dfce072058" +uuid = "b99e7846-7c00-51b0-8f62-c81ae34c0232" +version = "0.5.10" + +[[BlockDecomposition]] +deps = ["JuMP", "MathOptInterface", "Test"] +git-tree-sha1 = "045eeefd32419b34cabbe12aedbdc28581364153" +repo-rev = "master" +repo-url = "https://github.com/atoptima/BlockDecomposition.jl.git" +uuid = "6cde8614-403a-11e9-12f1-c10d0f0caca0" +version = "1.3.0" + +[[Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[CEnum]] +git-tree-sha1 = "215a9aa4a1f23fbd05b92769fdd62559488d70e9" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.1" + +[[Calculus]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" +uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" +version = "0.5.1" + +[[ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "b391f22252b8754f4440de1f37ece49d8a7314bb" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "0.9.44" + +[[CodecBzip2]] +deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"] +git-tree-sha1 = "2e62a725210ce3c3c2e1a3080190e7ca491f18d7" +uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" +version = "0.7.2" + +[[CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[ColunaDemos]] +deps = ["BlockDecomposition", "DelimitedFiles", "GLPK", "JuMP", "LightGraphs", "MathOptInterface"] +git-tree-sha1 = "5b72a43ed75502266f1e0bb3266f4401e383af4d" +repo-rev = "master" +repo-url = "git@github.com:atoptima/ColunaDemos.jl.git" +uuid = "a54e61d4-7723-11e9-2469-af255fcaa246" +version = "0.1.0" + +[[CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "e4e2b39db08f967cc1360951f01e8a75ec441cab" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.30.0" + +[[CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" + +[[DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "4437b64df1e0adccc3e5d1adbc3ac741095e4677" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.9" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[DiffResults]] +deps = ["StaticArrays"] +git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.0.3" + +[[DiffRules]] +deps = ["NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "214c3fcac57755cfda163d91c58893a8723f93e9" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.0.2" + +[[Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[DocStringExtensions]] +deps = ["LibGit2", "Markdown", "Pkg", "Test"] +git-tree-sha1 = "9d4f64f79012636741cf01133158a54b24924c32" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.8.4" + +[[Downloads]] +deps = ["ArgTools", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" + +[[DynamicSparseArrays]] +git-tree-sha1 = "0df939d04238dfbaf40463e6c062c2ba11fdd5ec" +uuid = "8086fd22-9a0c-46a5-a6c8-6e24676501fe" +version = "0.5.0" + +[[ExprTools]] +git-tree-sha1 = "10407a39b87f29d47ebaca8edbc75d7c302ff93e" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.3" + +[[ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "NaNMath", "Printf", "Random", "SpecialFunctions", "StaticArrays"] +git-tree-sha1 = "e2af66012e08966366a43251e1fd421522908be6" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.18" + +[[GLPK]] +deps = ["BinaryProvider", "CEnum", "GLPK_jll", "Libdl", "MathOptInterface"] +git-tree-sha1 = "d2539170674009054d96af7758c486a2e0e4f501" +uuid = "60bf3e95-4087-53dc-ae20-288a0d20c6a6" +version = "0.14.8" + +[[GLPK_jll]] +deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "01de09b070d4b8e3e1250c6542e16ed5cad45321" +uuid = "e8aa6df9-e6ca-548a-97ff-1f85fc5b8b98" +version = "5.0.0+0" + +[[GMP_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d" + +[[HTTP]] +deps = ["Base64", "Dates", "IniFile", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] +git-tree-sha1 = "1fd26bc48f96adcdd8823f7fc300053faf3d7ba1" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "0.9.9" + +[[Inflate]] +git-tree-sha1 = "f5fc07d4e706b84f72d54eedcc1c13d92fb0871c" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.2" + +[[IniFile]] +deps = ["Test"] +git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.0" + +[[InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "642a199af8b68253517b80bd3bfd17eb4e84df6e" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.3.0" + +[[JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "81690084b6198a2e1da36fcfda16eeca9f9f24e4" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.1" + +[[JSONSchema]] +deps = ["HTTP", "JSON", "ZipFile"] +git-tree-sha1 = "b84ab8139afde82c7c65ba2b792fe12e01dd7307" +uuid = "7d188eb4-7ad8-530c-ae41-71a32a6d4692" +version = "0.3.3" + +[[JuMP]] +deps = ["Calculus", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MathOptInterface", "MutableArithmetics", "NaNMath", "Printf", "Random", "SparseArrays", "SpecialFunctions", "Statistics"] +git-tree-sha1 = "8dfc5df8aad9f2cfebc8371b69700efd02060827" +uuid = "4076af6c-e467-56ae-b986-b466b2749572" +version = "0.21.8" + +[[LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + +[[LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + +[[LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[LightGraphs]] +deps = ["ArnoldiMethod", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "432428df5f360964040ed60418dd5601ecd240b6" +uuid = "093fc24a-ae57-5d10-9952-331d41423f4d" +version = "1.3.5" + +[[LinearAlgebra]] +deps = ["Libdl"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[LogExpFunctions]] +deps = ["DocStringExtensions", "LinearAlgebra"] +git-tree-sha1 = "1ba664552f1ef15325e68dc4c05c3ef8c2d5d885" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.2.4" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "6a8a2a625ab0dea913aba95c11370589e0239ff0" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.6" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[MathOptInterface]] +deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "JSON", "JSONSchema", "LinearAlgebra", "MutableArithmetics", "OrderedCollections", "SparseArrays", "Test", "Unicode"] +git-tree-sha1 = "575644e3c05b258250bb599e57cf73bbf1062901" +uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" +version = "0.9.22" + +[[MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] +git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.0.3" + +[[MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" + +[[MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "ad9b2bce6021631e0e20706d361972343a03e642" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "0.2.19" + +[[NaNMath]] +git-tree-sha1 = "bfe47e760d60b82b66b61d2d44128b62e3a369fb" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "0.3.5" + +[[NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" + +[[OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b9b8b8ed236998f91143938a760c2112dceeb2b4" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.4+0" + +[[OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "2276ac65f1e236e0a6ea70baff3f62ad4c625345" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.2" + +[[Parsers]] +deps = ["Dates"] +git-tree-sha1 = "c8abc88faa3f7a3950832ac5d6e690881590d6dc" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "1.1.0" + +[[Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[Preferences]] +deps = ["TOML"] +git-tree-sha1 = "00cfd92944ca9c760982747e9a1d0d5d86ab1e5a" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.2.2" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "daf7aec3fe3acb2131388f93a4c409b8c7f62226" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.3" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[SpecialFunctions]] +deps = ["ChainRulesCore", "LogExpFunctions", "OpenSpecFun_jll"] +git-tree-sha1 = "371204984184315ed7228bcc604d08e1bbc18f31" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "1.4.2" + +[[StaticArrays]] +deps = ["LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "a1f226ebe197578c25fcf948bfff3d0d12f2ff20" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.2.1" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" + +[[Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "bf8aacc899a1bd16522d0350e1e2310510d77236" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.9" + +[[TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "7c53c35547de1c5b9d46a4797cf6d8253807108c" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.5" + +[[URIs]] +git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.3.0" + +[[UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[ZipFile]] +deps = ["Libdl", "Printf", "Zlib_jll"] +git-tree-sha1 = "c3a5637e27e914a7a445b8d0ad063d701931e9f7" +uuid = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" +version = "0.9.3" + +[[Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" + +[[nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" + +[[p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" From b2604b29aded853ea7efd57ca489f7afaee576c1 Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Wed, 26 May 2021 10:35:53 +0200 Subject: [PATCH 11/13] change ci --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 53ccc5119..9f1d77d69 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: with: version: ${{ matrix.version }} arch: ${{ matrix.arch }} - - run: julia --project=@. -e 'using Pkg; Pkg.add(PackageSpec(url="https://github.com/atoptima/ColunaDemos.jl.git"));' + - run: julia --project=@. -e 'using Pkg; Pkg.add(PackageSpec(url="https://github.com/atoptima/ColunaDemos.jl.git")); Pkg.add(PackageSpec(url="https://github.com/atoptima/BlockDecomposition.jl.git"))' - uses: actions/cache@v1 env: cache-name: cache-artifacts From 27eaea7738abe4ee0b0293d69f8fba6b6338c0ea Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Wed, 26 May 2021 10:41:08 +0200 Subject: [PATCH 12/13] remove ci change --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f1d77d69..53ccc5119 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: with: version: ${{ matrix.version }} arch: ${{ matrix.arch }} - - run: julia --project=@. -e 'using Pkg; Pkg.add(PackageSpec(url="https://github.com/atoptima/ColunaDemos.jl.git")); Pkg.add(PackageSpec(url="https://github.com/atoptima/BlockDecomposition.jl.git"))' + - run: julia --project=@. -e 'using Pkg; Pkg.add(PackageSpec(url="https://github.com/atoptima/ColunaDemos.jl.git"));' - uses: actions/cache@v1 env: cache-name: cache-artifacts From eb25e96e4cd5f8655e16b4f70ac7dba10f613b32 Mon Sep 17 00:00:00 2001 From: Guillaume Marques Date: Wed, 26 May 2021 10:41:17 +0200 Subject: [PATCH 13/13] rm Manifest --- Manifest.toml | 439 -------------------------------------------------- 1 file changed, 439 deletions(-) delete mode 100644 Manifest.toml diff --git a/Manifest.toml b/Manifest.toml deleted file mode 100644 index c6dec6976..000000000 --- a/Manifest.toml +++ /dev/null @@ -1,439 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -[[ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" - -[[ArnoldiMethod]] -deps = ["LinearAlgebra", "Random", "StaticArrays"] -git-tree-sha1 = "f87e559f87a45bece9c9ed97458d3afe98b1ebb9" -uuid = "ec485272-7323-5ecc-a04f-4719b315124d" -version = "0.1.0" - -[[Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" - -[[Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[BenchmarkTools]] -deps = ["JSON", "Logging", "Printf", "Statistics", "UUIDs"] -git-tree-sha1 = "01ca3823217f474243cc2c8e6e1d1f45956fe872" -uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" -version = "1.0.0" - -[[BinaryProvider]] -deps = ["Libdl", "Logging", "SHA"] -git-tree-sha1 = "ecdec412a9abc8db54c0efc5548c64dfce072058" -uuid = "b99e7846-7c00-51b0-8f62-c81ae34c0232" -version = "0.5.10" - -[[BlockDecomposition]] -deps = ["JuMP", "MathOptInterface", "Test"] -git-tree-sha1 = "045eeefd32419b34cabbe12aedbdc28581364153" -repo-rev = "master" -repo-url = "https://github.com/atoptima/BlockDecomposition.jl.git" -uuid = "6cde8614-403a-11e9-12f1-c10d0f0caca0" -version = "1.3.0" - -[[Bzip2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" -uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.8+0" - -[[CEnum]] -git-tree-sha1 = "215a9aa4a1f23fbd05b92769fdd62559488d70e9" -uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" -version = "0.4.1" - -[[Calculus]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" -uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" -version = "0.5.1" - -[[ChainRulesCore]] -deps = ["Compat", "LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "b391f22252b8754f4440de1f37ece49d8a7314bb" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "0.9.44" - -[[CodecBzip2]] -deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"] -git-tree-sha1 = "2e62a725210ce3c3c2e1a3080190e7ca491f18d7" -uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" -version = "0.7.2" - -[[CodecZlib]] -deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" -uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.0" - -[[ColunaDemos]] -deps = ["BlockDecomposition", "DelimitedFiles", "GLPK", "JuMP", "LightGraphs", "MathOptInterface"] -git-tree-sha1 = "5b72a43ed75502266f1e0bb3266f4401e383af4d" -repo-rev = "master" -repo-url = "git@github.com:atoptima/ColunaDemos.jl.git" -uuid = "a54e61d4-7723-11e9-2469-af255fcaa246" -version = "0.1.0" - -[[CommonSubexpressions]] -deps = ["MacroTools", "Test"] -git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" -uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" -version = "0.3.0" - -[[Compat]] -deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] -git-tree-sha1 = "e4e2b39db08f967cc1360951f01e8a75ec441cab" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "3.30.0" - -[[CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" - -[[DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "4437b64df1e0adccc3e5d1adbc3ac741095e4677" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.9" - -[[Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" - -[[DelimitedFiles]] -deps = ["Mmap"] -uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" - -[[DiffResults]] -deps = ["StaticArrays"] -git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" -uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" -version = "1.0.3" - -[[DiffRules]] -deps = ["NaNMath", "Random", "SpecialFunctions"] -git-tree-sha1 = "214c3fcac57755cfda163d91c58893a8723f93e9" -uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" -version = "1.0.2" - -[[Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[DocStringExtensions]] -deps = ["LibGit2", "Markdown", "Pkg", "Test"] -git-tree-sha1 = "9d4f64f79012636741cf01133158a54b24924c32" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.8.4" - -[[Downloads]] -deps = ["ArgTools", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" - -[[DynamicSparseArrays]] -git-tree-sha1 = "0df939d04238dfbaf40463e6c062c2ba11fdd5ec" -uuid = "8086fd22-9a0c-46a5-a6c8-6e24676501fe" -version = "0.5.0" - -[[ExprTools]] -git-tree-sha1 = "10407a39b87f29d47ebaca8edbc75d7c302ff93e" -uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" -version = "0.1.3" - -[[ForwardDiff]] -deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "NaNMath", "Printf", "Random", "SpecialFunctions", "StaticArrays"] -git-tree-sha1 = "e2af66012e08966366a43251e1fd421522908be6" -uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.18" - -[[GLPK]] -deps = ["BinaryProvider", "CEnum", "GLPK_jll", "Libdl", "MathOptInterface"] -git-tree-sha1 = "d2539170674009054d96af7758c486a2e0e4f501" -uuid = "60bf3e95-4087-53dc-ae20-288a0d20c6a6" -version = "0.14.8" - -[[GLPK_jll]] -deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "01de09b070d4b8e3e1250c6542e16ed5cad45321" -uuid = "e8aa6df9-e6ca-548a-97ff-1f85fc5b8b98" -version = "5.0.0+0" - -[[GMP_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d" - -[[HTTP]] -deps = ["Base64", "Dates", "IniFile", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] -git-tree-sha1 = "1fd26bc48f96adcdd8823f7fc300053faf3d7ba1" -uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "0.9.9" - -[[Inflate]] -git-tree-sha1 = "f5fc07d4e706b84f72d54eedcc1c13d92fb0871c" -uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.2" - -[[IniFile]] -deps = ["Test"] -git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" -uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" -version = "0.5.0" - -[[InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[JLLWrappers]] -deps = ["Preferences"] -git-tree-sha1 = "642a199af8b68253517b80bd3bfd17eb4e84df6e" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.3.0" - -[[JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "81690084b6198a2e1da36fcfda16eeca9f9f24e4" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.1" - -[[JSONSchema]] -deps = ["HTTP", "JSON", "ZipFile"] -git-tree-sha1 = "b84ab8139afde82c7c65ba2b792fe12e01dd7307" -uuid = "7d188eb4-7ad8-530c-ae41-71a32a6d4692" -version = "0.3.3" - -[[JuMP]] -deps = ["Calculus", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MathOptInterface", "MutableArithmetics", "NaNMath", "Printf", "Random", "SparseArrays", "SpecialFunctions", "Statistics"] -git-tree-sha1 = "8dfc5df8aad9f2cfebc8371b69700efd02060827" -uuid = "4076af6c-e467-56ae-b986-b466b2749572" -version = "0.21.8" - -[[LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" - -[[LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" - -[[LibGit2]] -deps = ["Base64", "NetworkOptions", "Printf", "SHA"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" - -[[LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" - -[[Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[LightGraphs]] -deps = ["ArnoldiMethod", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "432428df5f360964040ed60418dd5601ecd240b6" -uuid = "093fc24a-ae57-5d10-9952-331d41423f4d" -version = "1.3.5" - -[[LinearAlgebra]] -deps = ["Libdl"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - -[[LogExpFunctions]] -deps = ["DocStringExtensions", "LinearAlgebra"] -git-tree-sha1 = "1ba664552f1ef15325e68dc4c05c3ef8c2d5d885" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.2.4" - -[[Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "6a8a2a625ab0dea913aba95c11370589e0239ff0" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.6" - -[[Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[MathOptInterface]] -deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "JSON", "JSONSchema", "LinearAlgebra", "MutableArithmetics", "OrderedCollections", "SparseArrays", "Test", "Unicode"] -git-tree-sha1 = "575644e3c05b258250bb599e57cf73bbf1062901" -uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" -version = "0.9.22" - -[[MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] -git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" -uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.0.3" - -[[MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" - -[[Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" - -[[MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" - -[[MutableArithmetics]] -deps = ["LinearAlgebra", "SparseArrays", "Test"] -git-tree-sha1 = "ad9b2bce6021631e0e20706d361972343a03e642" -uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" -version = "0.2.19" - -[[NaNMath]] -git-tree-sha1 = "bfe47e760d60b82b66b61d2d44128b62e3a369fb" -uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "0.3.5" - -[[NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" - -[[OpenSpecFun_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "b9b8b8ed236998f91143938a760c2112dceeb2b4" -uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" -version = "0.5.4+0" - -[[OrderedCollections]] -git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.4.1" - -[[Parameters]] -deps = ["OrderedCollections", "UnPack"] -git-tree-sha1 = "2276ac65f1e236e0a6ea70baff3f62ad4c625345" -uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" -version = "0.12.2" - -[[Parsers]] -deps = ["Dates"] -git-tree-sha1 = "c8abc88faa3f7a3950832ac5d6e690881590d6dc" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "1.1.0" - -[[Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" - -[[Preferences]] -deps = ["TOML"] -git-tree-sha1 = "00cfd92944ca9c760982747e9a1d0d5d86ab1e5a" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.2.2" - -[[Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[Random]] -deps = ["Serialization"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" - -[[Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" - -[[SimpleTraits]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "daf7aec3fe3acb2131388f93a4c409b8c7f62226" -uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.3" - -[[Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[SparseArrays]] -deps = ["LinearAlgebra", "Random"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - -[[SpecialFunctions]] -deps = ["ChainRulesCore", "LogExpFunctions", "OpenSpecFun_jll"] -git-tree-sha1 = "371204984184315ed7228bcc604d08e1bbc18f31" -uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "1.4.2" - -[[StaticArrays]] -deps = ["LinearAlgebra", "Random", "Statistics"] -git-tree-sha1 = "a1f226ebe197578c25fcf948bfff3d0d12f2ff20" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.2.1" - -[[Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" - -[[TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" - -[[Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" - -[[Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[TimerOutputs]] -deps = ["ExprTools", "Printf"] -git-tree-sha1 = "bf8aacc899a1bd16522d0350e1e2310510d77236" -uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" -version = "0.5.9" - -[[TranscodingStreams]] -deps = ["Random", "Test"] -git-tree-sha1 = "7c53c35547de1c5b9d46a4797cf6d8253807108c" -uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.9.5" - -[[URIs]] -git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.3.0" - -[[UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" - -[[UnPack]] -git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" -uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" -version = "1.0.2" - -[[Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" - -[[ZipFile]] -deps = ["Libdl", "Printf", "Zlib_jll"] -git-tree-sha1 = "c3a5637e27e914a7a445b8d0ad063d701931e9f7" -uuid = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" -version = "0.9.3" - -[[Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" - -[[nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" - -[[p7zip_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"