Improve error message when instance is infeasible

This commit is contained in:
2020-08-13 10:21:29 -05:00
parent 44df06bbfa
commit d8c9a1b30a
5 changed files with 43 additions and 14 deletions

View File

@@ -72,9 +72,13 @@ function validate(json, schema)
end
function load(path::String)::Instance
function parsefile(path::String)::Instance
return RELOG.parse(JSON.parsefile(path))
end
function parse(json::Dict)::Instance
basedir = dirname(@__FILE__)
json = JSON.parsefile(path)
json_schema = JSON.parsefile("$basedir/schemas/input.json")
validate(json, Schema(json_schema))
@@ -167,7 +171,7 @@ function load(path::String)::Instance
# Capacities
for (capacity_name, capacity_dict) in location_dict["capacities (tonne)"]
push!(sizes, PlantSize(parse(Float64, capacity_name),
push!(sizes, PlantSize(Base.parse(Float64, capacity_name),
capacity_dict["variable operating cost (\$/tonne)"],
capacity_dict["fixed operating cost (\$)"],
capacity_dict["opening cost (\$)"]))

View File

@@ -192,12 +192,12 @@ function create_process_node_constraints!(model::ManufacturingModel)
end
end
function solve(filename::String;
milp_optimizer=optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0),
lp_optimizer=optimizer_with_attributes(Clp.Optimizer, "LogLevel" => 0))
@info "Reading $filename..."
instance = RELOG.load(filename)
default_milp_optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0)
default_lp_optimizer = optimizer_with_attributes(Clp.Optimizer, "LogLevel" => 0)
function solve(instance::Instance;
milp_optimizer=default_milp_optimizer,
lp_optimizer=default_lp_optimizer)
@info "Building graph..."
graph = RELOG.build_graph(instance)
@@ -213,6 +213,11 @@ function solve(filename::String;
@info "Optimizing MILP..."
JuMP.optimize!(model.mip)
if !has_values(model.mip)
@warn "No solution available"
return Dict()
end
@info "Re-optimizing with integer variables fixed..."
all_vars = JuMP.all_variables(model.mip)
vals = Dict(var => JuMP.value(var) for var in all_vars)
@@ -229,6 +234,18 @@ function solve(filename::String;
return get_solution(model)
end
function solve(filename::String;
milp_optimizer=default_milp_optimizer,
lp_optimizer=default_lp_optimizer)
@info "Reading $filename..."
instance = RELOG.parsefile(filename)
return solve(instance,
milp_optimizer=milp_optimizer,
lp_optimizer=lp_optimizer)
end
function get_solution(model::ManufacturingModel)
mip, vars, eqs, graph, instance = model.mip, model.vars, model.eqs, model.graph, model.instance
T = instance.time