Update JuMP; print progress bars

v0.1
Alinson S. Xavier 6 years ago
parent 9b89826e67
commit cc49268ce4

@ -1,7 +1,7 @@
# Copyright (C) 2019 Argonne National Laboratory # Copyright (C) 2019 Argonne National Laboratory
# Written by Alinson Santos Xavier <axavier@anl.gov> # Written by Alinson Santos Xavier <axavier@anl.gov>
using JuMP, LinearAlgebra, Geodesy, Cbc using JuMP, LinearAlgebra, Geodesy, Cbc, ProgressBars
mutable struct ReverseManufacturingModel mutable struct ReverseManufacturingModel
mip::JuMP.Model mip::JuMP.Model
@ -68,8 +68,13 @@ function build_model(instance::ReverseManufacturingInstance,
) :: ReverseManufacturingModel ) :: ReverseManufacturingModel
println("Building optimization model...") println("Building optimization model...")
mip = isa(optimizer, JuMP.OptimizerFactory) ? Model(optimizer) : direct_model(optimizer) mip = Model(optimizer)
decision_nodes, process_nodes, arcs = create_nodes_and_arcs(instance) decision_nodes, process_nodes, arcs = create_nodes_and_arcs(instance)
println(" $(length(decision_nodes)) decision nodes")
println(" $(length(process_nodes)) process nodes")
println(" $(length(arcs)) arcs")
vars = DotDict() vars = DotDict()
vars.flow = Dict(a => @variable(mip, lower_bound=0) for a in arcs) vars.flow = Dict(a => @variable(mip, lower_bound=0) for a in arcs)
vars.node = Dict(n => @variable(mip, binary=true) for n in values(process_nodes)) vars.node = Dict(n => @variable(mip, binary=true) for n in values(process_nodes))
@ -78,17 +83,17 @@ function build_model(instance::ReverseManufacturingInstance,
println(" Creating objective function...") println(" Creating objective function...")
obj = @expression(mip, 0 * @variable(mip)) obj = @expression(mip, 0 * @variable(mip))
for a in arcs for a in tqdm(arcs)
for c in keys(a.costs) for c in keys(a.costs)
add_to_expression!(obj, a.costs[c], vars.flow[a]) add_to_expression!(obj, a.costs[c], vars.flow[a])
end end
end end
for n in values(process_nodes) for n in tqdm(values(process_nodes))
add_to_expression!(obj, n.cost, vars.node[n]) add_to_expression!(obj, n.cost, vars.node[n])
end end
@objective(mip, Min, obj) @objective(mip, Min, obj)
return return ReverseManufacturingModel(mip, return ReverseManufacturingModel(mip,
vars, vars,
arcs, arcs,
decision_nodes, decision_nodes,
@ -97,7 +102,7 @@ end
function create_decision_node_constraints!(mip, nodes, vars) function create_decision_node_constraints!(mip, nodes, vars)
println(" Creating decision-node constraints...") println(" Creating decision-node constraints...")
for (id, n) in nodes for (id, n) in tqdm(nodes)
@constraint(mip, @constraint(mip,
sum(vars.flow[a] for a in n.incoming_arcs) + n.balance == sum(vars.flow[a] for a in n.incoming_arcs) + n.balance ==
sum(vars.flow[a] for a in n.outgoing_arcs)) sum(vars.flow[a] for a in n.outgoing_arcs))
@ -106,7 +111,7 @@ end
function create_process_node_constraints!(mip, nodes, vars) function create_process_node_constraints!(mip, nodes, vars)
println(" Creating process-node constraints...") println(" Creating process-node constraints...")
for (id, n) in nodes for (id, n) in tqdm(nodes)
# Output amount is implied by input amount # Output amount is implied by input amount
input_sum = isempty(n.incoming_arcs) ? 0 : sum(vars.flow[a] for a in n.incoming_arcs) input_sum = isempty(n.incoming_arcs) ? 0 : sum(vars.flow[a] for a in n.incoming_arcs)
for a in n.outgoing_arcs for a in n.outgoing_arcs
@ -228,8 +233,7 @@ function calculate_distance(source_lat, source_lon, dest_lat, dest_lon)::Float64
end end
function solve(filename::String; function solve(filename::String;
optimizer=with_optimizer(Cbc.Optimizer, optimizer=Cbc.Optimizer)
logLevel=0))
println("Reading $filename") println("Reading $filename")
instance = ReverseManufacturing.readfile(filename) instance = ReverseManufacturing.readfile(filename)
model = ReverseManufacturing.build_model(instance, optimizer) model = ReverseManufacturing.build_model(instance, optimizer)

@ -5,7 +5,7 @@ using ReverseManufacturing, Cbc, JuMP, Printf
@testset "Model" begin @testset "Model" begin
instance = ReverseManufacturing.load("samples/s1") instance = ReverseManufacturing.load("samples/s1")
model = ReverseManufacturing.build_model(instance, with_optimizer(Cbc.Optimizer)) model = ReverseManufacturing.build_model(instance, Cbc.Optimizer)
# Verify nodes # Verify nodes
@test ("P1", "Origin", "C1") in keys(model.decision_nodes) @test ("P1", "Origin", "C1") in keys(model.decision_nodes)

Loading…
Cancel
Save