mirror of https://github.com/ANL-CEEESA/RELOG.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.8 KiB
103 lines
3.8 KiB
# Copyright (C) 2020 Argonne National Laboratory
|
|
# Written by Alinson Santos Xavier <axavier@anl.gov>
|
|
|
|
using RELOG, Cbc, JuMP, Printf, JSON, MathOptInterface.FileFormats
|
|
|
|
@testset "Model" begin
|
|
@testset "build" begin
|
|
basedir = dirname(@__FILE__)
|
|
instance = RELOG.parsefile("$basedir/../instances/s1.json")
|
|
graph = RELOG.build_graph(instance)
|
|
model = RELOG.build_model(instance, graph, Cbc.Optimizer)
|
|
set_optimizer_attribute(model.mip, "logLevel", 0)
|
|
|
|
process_node_by_location_name =
|
|
Dict(n.location.location_name => n for n in graph.process_nodes)
|
|
|
|
shipping_node_by_location_and_product_names = Dict(
|
|
(n.location.location_name, n.product.name) => n for
|
|
n in graph.plant_shipping_nodes
|
|
)
|
|
|
|
@test length(model.vars.flow) == 76
|
|
@test length(model.vars.dispose) == 16
|
|
@test length(model.vars.open_plant) == 12
|
|
@test length(model.vars.capacity) == 12
|
|
@test length(model.vars.expansion) == 12
|
|
|
|
l1 = process_node_by_location_name["L1"]
|
|
v = model.vars.capacity[l1, 1]
|
|
@test lower_bound(v) == 0.0
|
|
@test upper_bound(v) == 1000.0
|
|
|
|
v = model.vars.expansion[l1, 1]
|
|
@test lower_bound(v) == 0.0
|
|
@test upper_bound(v) == 750.0
|
|
|
|
v = model.vars.dispose[shipping_node_by_location_and_product_names["L1", "P2"], 1]
|
|
@test lower_bound(v) == 0.0
|
|
@test upper_bound(v) == 1.0
|
|
|
|
# dest = FileFormats.Model(format = FileFormats.FORMAT_LP)
|
|
# MOI.copy_to(dest, model.mip)
|
|
# MOI.write_to_file(dest, "model.lp")
|
|
end
|
|
|
|
@testset "solve (exact)" begin
|
|
solution_filename_a = tempname()
|
|
solution_filename_b = tempname()
|
|
solution =
|
|
RELOG.solve("$(pwd())/../instances/s1.json", output = solution_filename_a)
|
|
|
|
@test isfile(solution_filename_a)
|
|
|
|
RELOG.write(solution, solution_filename_b)
|
|
@test isfile(solution_filename_b)
|
|
|
|
@test "Costs" in keys(solution)
|
|
@test "Fixed operating (\$)" in keys(solution["Costs"])
|
|
@test "Transportation (\$)" in keys(solution["Costs"])
|
|
@test "Variable operating (\$)" in keys(solution["Costs"])
|
|
@test "Total (\$)" in keys(solution["Costs"])
|
|
|
|
@test "Plants" in keys(solution)
|
|
@test "F1" in keys(solution["Plants"])
|
|
@test "F2" in keys(solution["Plants"])
|
|
@test "F3" in keys(solution["Plants"])
|
|
@test "F4" in keys(solution["Plants"])
|
|
end
|
|
|
|
|
|
@testset "solve (heuristic)" begin
|
|
# Should not crash
|
|
solution = RELOG.solve("$(pwd())/../instances/s1.json", heuristic = true)
|
|
end
|
|
|
|
@testset "infeasible solve" begin
|
|
json = JSON.parsefile("$(pwd())/../instances/s1.json")
|
|
for (location_name, location_dict) in json["products"]["P1"]["initial amounts"]
|
|
location_dict["amount (tonne)"] *= 1000
|
|
end
|
|
RELOG.solve(RELOG.parse(json))
|
|
end
|
|
|
|
@testset "storage" begin
|
|
basedir = dirname(@__FILE__)
|
|
filename = "$basedir/fixtures/storage.json"
|
|
instance = RELOG.parsefile(filename)
|
|
@test instance.plants[1].storage_limit == 50.0
|
|
@test instance.plants[1].storage_cost == [2.0, 1.5, 1.0]
|
|
|
|
solution = RELOG.solve(filename)
|
|
plant_dict = solution["Plants"]["mega plant"]["Chicago"]
|
|
@test plant_dict["Variable operating cost (\$)"] == [500.0, 0.0, 100.0]
|
|
@test plant_dict["Process (tonne)"] == [50.0, 0.0, 50.0]
|
|
@test plant_dict["Storage (tonne)"] == [50.0, 50.0, 0.0]
|
|
@test plant_dict["Storage cost (\$)"] == [100.0, 75.0, 0.0]
|
|
|
|
@test solution["Costs"]["Variable operating (\$)"] == [500.0, 0.0, 100.0]
|
|
@test solution["Costs"]["Storage (\$)"] == [100.0, 75.0, 0.0]
|
|
@test solution["Costs"]["Total (\$)"] == [600.0, 75.0, 100.0]
|
|
end
|
|
end
|