mirror of
https://github.com/ANL-CEEESA/RELOG.git
synced 2025-12-05 23:38:52 -06:00
Implement basic reports; fix boat example
This commit is contained in:
@@ -4,6 +4,8 @@ authors = ["Alinson S. Xavier <git@axavier.org>"]
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
|
||||||
|
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
|
||||||
Geodesy = "0ef565a4-170c-5f04-8de2-149903a85f3d"
|
Geodesy = "0ef565a4-170c-5f04-8de2-149903a85f3d"
|
||||||
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
|
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
|
||||||
JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
|
JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
|
||||||
|
|||||||
@@ -5,5 +5,8 @@ include("instance/parse.jl")
|
|||||||
include("model/jumpext.jl")
|
include("model/jumpext.jl")
|
||||||
include("model/dist.jl")
|
include("model/dist.jl")
|
||||||
include("model/build.jl")
|
include("model/build.jl")
|
||||||
|
include("reports/plants.jl")
|
||||||
|
include("reports/transportation.jl")
|
||||||
|
include("reports/centers.jl")
|
||||||
|
|
||||||
end # module RELOG
|
end # module RELOG
|
||||||
|
|||||||
@@ -6,14 +6,15 @@ function build_model(instance::Instance; optimizer, variable_names::Bool = false
|
|||||||
products = instance.products
|
products = instance.products
|
||||||
plants = instance.plants
|
plants = instance.plants
|
||||||
T = 1:instance.time_horizon
|
T = 1:instance.time_horizon
|
||||||
|
model.ext[:instance] = instance
|
||||||
|
|
||||||
# Transportation edges
|
# Transportation edges
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
# Connectivity
|
# Connectivity
|
||||||
E = []
|
model.ext[:E] = E = []
|
||||||
E_in = Dict(src => [] for src in plants ∪ centers)
|
model.ext[:E_in] = E_in = Dict(src => [] for src in plants ∪ centers)
|
||||||
E_out = Dict(src => [] for src in plants ∪ centers)
|
model.ext[:E_out] = E_out = Dict(src => [] for src in plants ∪ centers)
|
||||||
|
|
||||||
function push_edge!(src, dst, m)
|
function push_edge!(src, dst, m)
|
||||||
push!(E, (src, dst, m))
|
push!(E, (src, dst, m))
|
||||||
@@ -28,7 +29,7 @@ function build_model(instance::Instance; optimizer, variable_names::Bool = false
|
|||||||
# Plant to plant
|
# Plant to plant
|
||||||
for p2 in plants
|
for p2 in plants
|
||||||
p1 != p2 || continue
|
p1 != p2 || continue
|
||||||
m ∉ keys(p2.input_mix) || continue
|
m ∈ keys(p2.input_mix) || continue
|
||||||
push_edge!(p1, p2, m)
|
push_edge!(p1, p2, m)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -57,7 +58,7 @@ function build_model(instance::Instance; optimizer, variable_names::Bool = false
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Distances
|
# Distances
|
||||||
distances = Dict()
|
model.ext[:distances] = distances = Dict()
|
||||||
for (p1, p2, m) in E
|
for (p1, p2, m) in E
|
||||||
d = _calculate_distance(p1.latitude, p1.longitude, p2.latitude, p2.longitude)
|
d = _calculate_distance(p1.latitude, p1.longitude, p2.latitude, p2.longitude)
|
||||||
distances[p1, p2, m] = d
|
distances[p1, p2, m] = d
|
||||||
@@ -86,9 +87,6 @@ function build_model(instance::Instance; optimizer, variable_names::Bool = false
|
|||||||
for p in plants, m in keys(p.output), t in T
|
for p in plants, m in keys(p.output), t in T
|
||||||
z_prod[p.name, m.name, t] = @variable(model, lower_bound = 0)
|
z_prod[p.name, m.name, t] = @variable(model, lower_bound = 0)
|
||||||
end
|
end
|
||||||
for c in centers, m in c.outputs, t in T
|
|
||||||
z_prod[c.name, m.name, t] = @variable(model, lower_bound = 0)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Amount of product m disposed at plant/center p at time T
|
# Amount of product m disposed at plant/center p at time T
|
||||||
z_disp = _init(model, :z_disp)
|
z_disp = _init(model, :z_disp)
|
||||||
|
|||||||
47
src/reports/centers.jl
Normal file
47
src/reports/centers.jl
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# RELOG: Reverse Logistics Optimization
|
||||||
|
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||||
|
# Released under the modified BSD license. See COPYING.md for more details.
|
||||||
|
|
||||||
|
using DataFrames
|
||||||
|
using CSV
|
||||||
|
|
||||||
|
function centers_report(model)::DataFrame
|
||||||
|
df = DataFrame()
|
||||||
|
df."center" = String[]
|
||||||
|
df."year" = Int[]
|
||||||
|
df."input product" = String[]
|
||||||
|
df."input amount (tonne)" = Float64[]
|
||||||
|
|
||||||
|
centers = model.ext[:instance].centers
|
||||||
|
T = 1:model.ext[:instance].time_horizon
|
||||||
|
|
||||||
|
for c in centers, t in T
|
||||||
|
input_name = (c.input === nothing) ? "" : c.input.name
|
||||||
|
input = round(value(model[:z_input][c.name, t]), digits = 3)
|
||||||
|
push!(df, [c.name, t, input_name, input])
|
||||||
|
end
|
||||||
|
return df
|
||||||
|
end
|
||||||
|
|
||||||
|
function center_outputs_report(model)::DataFrame
|
||||||
|
df = DataFrame()
|
||||||
|
df."center" = String[]
|
||||||
|
df."output product" = String[]
|
||||||
|
df."year" = Int[]
|
||||||
|
df."amount collected (tonne)" = Float64[]
|
||||||
|
df."amount disposed (tonne)" = Float64[]
|
||||||
|
|
||||||
|
centers = model.ext[:instance].centers
|
||||||
|
T = 1:model.ext[:instance].time_horizon
|
||||||
|
|
||||||
|
for c in centers, m in c.outputs, t in T
|
||||||
|
collected = round(value(model[:z_collected][c.name, m.name, t]), digits = 3)
|
||||||
|
disposed = round(value(model[:z_disp][c.name, m.name, t]), digits = 3)
|
||||||
|
push!(df, [c.name, m.name, t, collected, disposed])
|
||||||
|
end
|
||||||
|
return df
|
||||||
|
end
|
||||||
|
|
||||||
|
write_centers_report(solution, filename) = CSV.write(filename, centers_report(solution))
|
||||||
|
write_center_outputs_report(solution, filename) =
|
||||||
|
CSV.write(filename, center_outputs_report(solution))
|
||||||
49
src/reports/plants.jl
Normal file
49
src/reports/plants.jl
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# RELOG: Reverse Logistics Optimization
|
||||||
|
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||||
|
# Released under the modified BSD license. See COPYING.md for more details.
|
||||||
|
|
||||||
|
using DataFrames
|
||||||
|
using CSV
|
||||||
|
|
||||||
|
function plants_report(model)::DataFrame
|
||||||
|
df = DataFrame()
|
||||||
|
df."plant" = String[]
|
||||||
|
df."year" = Int[]
|
||||||
|
df."operational?" = Bool[]
|
||||||
|
df."input amount (tonne)" = Float64[]
|
||||||
|
|
||||||
|
plants = model.ext[:instance].plants
|
||||||
|
T = 1:model.ext[:instance].time_horizon
|
||||||
|
|
||||||
|
for p in plants, t in T
|
||||||
|
operational = JuMP.value(model[:x][p.name, t]) > 0.5
|
||||||
|
input = value(model[:z_input][p.name, t])
|
||||||
|
operational || continue
|
||||||
|
push!(df, [p.name, t, operational, input])
|
||||||
|
end
|
||||||
|
return df
|
||||||
|
end
|
||||||
|
|
||||||
|
function plant_outputs_report(model)::DataFrame
|
||||||
|
df = DataFrame()
|
||||||
|
df."plant" = String[]
|
||||||
|
df."output product" = String[]
|
||||||
|
df."year" = Int[]
|
||||||
|
df."amount produced (tonne)" = Float64[]
|
||||||
|
df."amount disposed (tonne)" = Float64[]
|
||||||
|
|
||||||
|
plants = model.ext[:instance].plants
|
||||||
|
T = 1:model.ext[:instance].time_horizon
|
||||||
|
|
||||||
|
for p in plants, m in keys(p.output), t in T
|
||||||
|
produced = JuMP.value(model[:z_prod][p.name, m.name, t])
|
||||||
|
disposed = JuMP.value(model[:z_disp][p.name, m.name, t])
|
||||||
|
produced > 1e-3 || continue
|
||||||
|
push!(df, [p.name, m.name, t, produced, disposed])
|
||||||
|
end
|
||||||
|
return df
|
||||||
|
end
|
||||||
|
|
||||||
|
write_plants_report(solution, filename) = CSV.write(filename, plants_report(solution))
|
||||||
|
write_plant_outputs_report(solution, filename) =
|
||||||
|
CSV.write(filename, plant_outputs_report(solution))
|
||||||
31
src/reports/transportation.jl
Normal file
31
src/reports/transportation.jl
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# RELOG: Reverse Logistics Optimization
|
||||||
|
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||||
|
# Released under the modified BSD license. See COPYING.md for more details.
|
||||||
|
|
||||||
|
using DataFrames
|
||||||
|
using CSV
|
||||||
|
|
||||||
|
function transportation_report(model)::DataFrame
|
||||||
|
df = DataFrame()
|
||||||
|
df."source" = String[]
|
||||||
|
df."destination" = String[]
|
||||||
|
df."product" = String[]
|
||||||
|
df."year" = Int[]
|
||||||
|
df."amount sent (tonne)" = Float64[]
|
||||||
|
df."distance (km)" = Float64[]
|
||||||
|
|
||||||
|
E = model.ext[:E]
|
||||||
|
distances = model.ext[:distances]
|
||||||
|
T = 1:model.ext[:instance].time_horizon
|
||||||
|
|
||||||
|
for (p1, p2, m) in E, t in T
|
||||||
|
amount = value(model[:y][p1.name, p2.name, m.name, t])
|
||||||
|
amount > 1e-3 || continue
|
||||||
|
distance = distances[p1, p2, m]
|
||||||
|
push!(df, [p1.name, p2.name, m.name, t, amount, distance])
|
||||||
|
end
|
||||||
|
return df
|
||||||
|
end
|
||||||
|
|
||||||
|
write_transportation_report(solution, filename) =
|
||||||
|
CSV.write(filename, transportation_report(solution))
|
||||||
94
test/fixtures/boat_example.ipynb
vendored
94
test/fixtures/boat_example.ipynb
vendored
@@ -2,51 +2,59 @@
|
|||||||
"cells": [
|
"cells": [
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 12,
|
"execution_count": 67,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"import json\n",
|
"import json\n",
|
||||||
"\n",
|
"\n",
|
||||||
|
"# cities_a = {\n",
|
||||||
|
"# \"Chicago\": [41.881832, -87.623177],\n",
|
||||||
|
"# \"New York City\": [40.712776, -74.005974],\n",
|
||||||
|
"# \"Los Angeles\": [34.052235, -118.243683],\n",
|
||||||
|
"# \"Houston\": [29.760427, -95.369804],\n",
|
||||||
|
"# \"Phoenix\": [33.448376, -112.074036],\n",
|
||||||
|
"# \"Philadelphia\": [39.952583, -75.165222],\n",
|
||||||
|
"# \"San Antonio\": [29.424122, -98.493629],\n",
|
||||||
|
"# \"San Diego\": [32.715736, -117.161087],\n",
|
||||||
|
"# \"Dallas\": [32.776664, -96.796988],\n",
|
||||||
|
"# \"San Jose\": [37.338208, -121.886329],\n",
|
||||||
|
"# \"Austin\": [30.267153, -97.743061],\n",
|
||||||
|
"# \"Jacksonville\": [30.332184, -81.655651],\n",
|
||||||
|
"# \"Fort Worth\": [32.755488, -97.330766],\n",
|
||||||
|
"# \"Columbus\": [39.961176, -82.998794],\n",
|
||||||
|
"# \"Charlotte\": [35.227087, -80.843127],\n",
|
||||||
|
"# \"Indianapolis\": [39.768403, -86.158068],\n",
|
||||||
|
"# \"San Francisco\": [37.774929, -122.419416],\n",
|
||||||
|
"# \"Seattle\": [47.606209, -122.332071],\n",
|
||||||
|
"# \"Denver\": [39.739236, -104.990251],\n",
|
||||||
|
"# \"Washington D.C.\": [38.907192, -77.036871],\n",
|
||||||
|
"# \"Nashville\": [36.162664, -86.781602],\n",
|
||||||
|
"# \"Detroit\": [42.331427, -83.045754],\n",
|
||||||
|
"# \"Oklahoma City\": [35.467560, -97.516428],\n",
|
||||||
|
"# \"Portland\": [45.505106, -122.675026],\n",
|
||||||
|
"# \"Las Vegas\": [36.169941, -115.139830],\n",
|
||||||
|
"# }\n",
|
||||||
|
"\n",
|
||||||
|
"# cities_b = {\n",
|
||||||
|
"# \"Chicago\": [41.881832, -87.623177],\n",
|
||||||
|
"# \"Phoenix\": [33.448376, -112.074036],\n",
|
||||||
|
"# \"Dallas\": [32.776664, -96.796988],\n",
|
||||||
|
"# \"San Jose\": [37.338208, -121.886329],\n",
|
||||||
|
"# \"Seattle\": [47.606209, -122.332071],\n",
|
||||||
|
"# \"Las Vegas\": [36.169941, -115.139830],\n",
|
||||||
|
"# }\n",
|
||||||
|
"\n",
|
||||||
"cities_a = {\n",
|
"cities_a = {\n",
|
||||||
" \"Chicago\": [41.881832, -87.623177],\n",
|
" \"Chicago\": [41.881832, -87.623177],\n",
|
||||||
" \"New York City\": [40.712776, -74.005974],\n",
|
|
||||||
" \"Los Angeles\": [34.052235, -118.243683],\n",
|
|
||||||
" \"Houston\": [29.760427, -95.369804],\n",
|
|
||||||
" \"Phoenix\": [33.448376, -112.074036],\n",
|
|
||||||
" \"Philadelphia\": [39.952583, -75.165222],\n",
|
|
||||||
" \"San Antonio\": [29.424122, -98.493629],\n",
|
|
||||||
" \"San Diego\": [32.715736, -117.161087],\n",
|
|
||||||
" \"Dallas\": [32.776664, -96.796988],\n",
|
|
||||||
" \"San Jose\": [37.338208, -121.886329],\n",
|
|
||||||
" \"Austin\": [30.267153, -97.743061],\n",
|
|
||||||
" \"Jacksonville\": [30.332184, -81.655651],\n",
|
|
||||||
" \"Fort Worth\": [32.755488, -97.330766],\n",
|
|
||||||
" \"Columbus\": [39.961176, -82.998794],\n",
|
|
||||||
" \"Charlotte\": [35.227087, -80.843127],\n",
|
|
||||||
" \"Indianapolis\": [39.768403, -86.158068],\n",
|
|
||||||
" \"San Francisco\": [37.774929, -122.419416],\n",
|
|
||||||
" \"Seattle\": [47.606209, -122.332071],\n",
|
|
||||||
" \"Denver\": [39.739236, -104.990251],\n",
|
|
||||||
" \"Washington D.C.\": [38.907192, -77.036871],\n",
|
|
||||||
" \"Nashville\": [36.162664, -86.781602],\n",
|
|
||||||
" \"Detroit\": [42.331427, -83.045754],\n",
|
|
||||||
" \"Oklahoma City\": [35.467560, -97.516428],\n",
|
|
||||||
" \"Portland\": [45.505106, -122.675026],\n",
|
|
||||||
" \"Las Vegas\": [36.169941, -115.139830],\n",
|
|
||||||
"}\n",
|
"}\n",
|
||||||
"\n",
|
"\n",
|
||||||
"cities_b = {\n",
|
"cities_b = {\n",
|
||||||
" \"Chicago\": [41.881832, -87.623177],\n",
|
" \"Chicago\": [41.881832, -87.623177],\n",
|
||||||
" \"Phoenix\": [33.448376, -112.074036],\n",
|
|
||||||
" \"Dallas\": [32.776664, -96.796988],\n",
|
|
||||||
" \"San Jose\": [37.338208, -121.886329],\n",
|
|
||||||
" \"Seattle\": [47.606209, -122.332071],\n",
|
|
||||||
" \"Las Vegas\": [36.169941, -115.139830],\n",
|
|
||||||
"}\n",
|
"}\n",
|
||||||
"\n",
|
"\n",
|
||||||
"parameters = {\n",
|
"parameters = {\n",
|
||||||
" \"time horizon (years)\": 10,\n",
|
" \"time horizon (years)\": 1,\n",
|
||||||
" \"building period (years)\": [1],\n",
|
" \"building period (years)\": [1],\n",
|
||||||
" \"distance metric\": \"Euclidean\",\n",
|
" \"distance metric\": \"Euclidean\",\n",
|
||||||
"}\n",
|
"}\n",
|
||||||
@@ -54,24 +62,24 @@
|
|||||||
"nail_factory = {\n",
|
"nail_factory = {\n",
|
||||||
" \"input\": None,\n",
|
" \"input\": None,\n",
|
||||||
" \"outputs\": [\"Nail\"],\n",
|
" \"outputs\": [\"Nail\"],\n",
|
||||||
" \"fixed output (tonne)\": {\"Nail\": 1},\n",
|
" \"fixed output (tonne)\": {\"Nail\": 5},\n",
|
||||||
" \"variable output (tonne/tonne)\": {\"Nail\": 0},\n",
|
" \"variable output (tonne/tonne)\": {\"Nail\": 0},\n",
|
||||||
" \"revenue ($/tonne)\": None,\n",
|
" \"revenue ($/tonne)\": None,\n",
|
||||||
" \"collection cost ($/tonne)\": {\"Nail\": 1000},\n",
|
" \"collection cost ($/tonne)\": {\"Nail\": 1000},\n",
|
||||||
" \"operating cost ($)\": 0,\n",
|
" \"operating cost ($)\": 0,\n",
|
||||||
" \"disposal limit (tonne)\": {\"Nail\": None},\n",
|
" \"disposal limit (tonne)\": {\"Nail\": 0},\n",
|
||||||
" \"disposal cost ($/tonne)\": {\"Nail\": 0},\n",
|
" \"disposal cost ($/tonne)\": {\"Nail\": 0},\n",
|
||||||
"}\n",
|
"}\n",
|
||||||
"\n",
|
"\n",
|
||||||
"forest = {\n",
|
"forest = {\n",
|
||||||
" \"input\": None,\n",
|
" \"input\": None,\n",
|
||||||
" \"outputs\": [\"Wood\"],\n",
|
" \"outputs\": [\"Wood\"],\n",
|
||||||
" \"fixed output (tonne)\": {\"Wood\": 100},\n",
|
" \"fixed output (tonne)\": {\"Wood\": 95},\n",
|
||||||
" \"variable output (tonne/tonne)\": {\"Wood\": 0},\n",
|
" \"variable output (tonne/tonne)\": {\"Wood\": 0},\n",
|
||||||
" \"revenue ($/tonne)\": None,\n",
|
" \"revenue ($/tonne)\": None,\n",
|
||||||
" \"collection cost ($/tonne)\": {\"Wood\": 250},\n",
|
" \"collection cost ($/tonne)\": {\"Wood\": 250},\n",
|
||||||
" \"operating cost ($)\": 0,\n",
|
" \"operating cost ($)\": 0,\n",
|
||||||
" \"disposal limit (tonne)\": {\"Wood\": None},\n",
|
" \"disposal limit (tonne)\": {\"Wood\": 0},\n",
|
||||||
" \"disposal cost ($/tonne)\": {\"Wood\": 0},\n",
|
" \"disposal cost ($/tonne)\": {\"Wood\": 0},\n",
|
||||||
"}\n",
|
"}\n",
|
||||||
"\n",
|
"\n",
|
||||||
@@ -80,7 +88,7 @@
|
|||||||
" \"outputs\": [\"UsedBoat\"],\n",
|
" \"outputs\": [\"UsedBoat\"],\n",
|
||||||
" \"fixed output (tonne)\": {\"UsedBoat\": 0},\n",
|
" \"fixed output (tonne)\": {\"UsedBoat\": 0},\n",
|
||||||
" \"variable output (tonne/tonne)\": {\"UsedBoat\": [0.10, 0.25, 0.10]},\n",
|
" \"variable output (tonne/tonne)\": {\"UsedBoat\": [0.10, 0.25, 0.10]},\n",
|
||||||
" \"revenue ($/tonne)\": 3_000,\n",
|
" \"revenue ($/tonne)\": 300_000,\n",
|
||||||
" \"collection cost ($/tonne)\": {\"UsedBoat\": 100},\n",
|
" \"collection cost ($/tonne)\": {\"UsedBoat\": 100},\n",
|
||||||
" \"operating cost ($)\": 125_000,\n",
|
" \"operating cost ($)\": 125_000,\n",
|
||||||
" \"disposal limit (tonne)\": {\"UsedBoat\": 0},\n",
|
" \"disposal limit (tonne)\": {\"UsedBoat\": 0},\n",
|
||||||
@@ -115,7 +123,7 @@
|
|||||||
" },\n",
|
" },\n",
|
||||||
" \"capacities\": [\n",
|
" \"capacities\": [\n",
|
||||||
" {\n",
|
" {\n",
|
||||||
" \"size (tonne)\": 50,\n",
|
" \"size (tonne)\": 200,\n",
|
||||||
" \"opening cost ($)\": 10_000,\n",
|
" \"opening cost ($)\": 10_000,\n",
|
||||||
" \"fixed operating cost ($)\": 1_000,\n",
|
" \"fixed operating cost ($)\": 1_000,\n",
|
||||||
" \"variable operating cost ($/tonne)\": 5,\n",
|
" \"variable operating cost ($/tonne)\": 5,\n",
|
||||||
@@ -144,7 +152,7 @@
|
|||||||
" \"Nail\": 0,\n",
|
" \"Nail\": 0,\n",
|
||||||
" \"Wood\": 0,\n",
|
" \"Wood\": 0,\n",
|
||||||
" },\n",
|
" },\n",
|
||||||
" \"disposal limit (tonne)\": {\"Nail\": None, \"Wood\": None},\n",
|
" \"disposal limit (tonne)\": {\"Nail\": 0, \"Wood\": 0},\n",
|
||||||
" \"capacities\": [\n",
|
" \"capacities\": [\n",
|
||||||
" {\n",
|
" {\n",
|
||||||
" \"size (tonne)\": 50,\n",
|
" \"size (tonne)\": 50,\n",
|
||||||
@@ -166,7 +174,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 13,
|
"execution_count": 68,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -199,8 +207,10 @@
|
|||||||
" \"longitude (deg)\": city_location[1],\n",
|
" \"longitude (deg)\": city_location[1],\n",
|
||||||
" }\n",
|
" }\n",
|
||||||
" for (city_name, city_location) in cities_a.items()\n",
|
" for (city_name, city_location) in cities_a.items()\n",
|
||||||
" },\n",
|
" }\n",
|
||||||
" \"plants\": {\n",
|
" ,\n",
|
||||||
|
" \"plants\":\n",
|
||||||
|
" {\n",
|
||||||
" f\"BoatFactory ({city_name})\": {\n",
|
" f\"BoatFactory ({city_name})\": {\n",
|
||||||
" **boat_factory,\n",
|
" **boat_factory,\n",
|
||||||
" \"latitude (deg)\": city_location[0],\n",
|
" \"latitude (deg)\": city_location[0],\n",
|
||||||
@@ -209,7 +219,7 @@
|
|||||||
" for (city_name, city_location) in cities_a.items()\n",
|
" for (city_name, city_location) in cities_a.items()\n",
|
||||||
" } | {\n",
|
" } | {\n",
|
||||||
" f\"RecyclingPlant ({city_name})\": {\n",
|
" f\"RecyclingPlant ({city_name})\": {\n",
|
||||||
" **boat_factory,\n",
|
" **recycling_plant,\n",
|
||||||
" \"latitude (deg)\": city_location[0],\n",
|
" \"latitude (deg)\": city_location[0],\n",
|
||||||
" \"longitude (deg)\": city_location[1],\n",
|
" \"longitude (deg)\": city_location[1],\n",
|
||||||
" }\n",
|
" }\n",
|
||||||
|
|||||||
3054
test/fixtures/boat_example.json
vendored
3054
test/fixtures/boat_example.json
vendored
File diff suppressed because it is too large
Load Diff
@@ -7,6 +7,7 @@ using JuliaFormatter
|
|||||||
include("instance/parse_test.jl")
|
include("instance/parse_test.jl")
|
||||||
include("model/build_test.jl")
|
include("model/build_test.jl")
|
||||||
include("model/dist_test.jl")
|
include("model/dist_test.jl")
|
||||||
|
include("reports_test.jl")
|
||||||
|
|
||||||
basedir = dirname(@__FILE__)
|
basedir = dirname(@__FILE__)
|
||||||
|
|
||||||
@@ -18,9 +19,9 @@ function runtests()
|
|||||||
@testset "RELOG" begin
|
@testset "RELOG" begin
|
||||||
instance_parse_test_1()
|
instance_parse_test_1()
|
||||||
instance_parse_test_2()
|
instance_parse_test_2()
|
||||||
model_build_test_1()
|
model_build_test()
|
||||||
model_build_test_2()
|
|
||||||
model_dist_test()
|
model_dist_test()
|
||||||
|
report_tests()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Test
|
|||||||
using HiGHS
|
using HiGHS
|
||||||
using JuMP
|
using JuMP
|
||||||
|
|
||||||
function model_build_test_1()
|
function model_build_test()
|
||||||
instance = RELOG.parsefile(fixture("simple.json"))
|
instance = RELOG.parsefile(fixture("simple.json"))
|
||||||
model = RELOG.build_model(instance, optimizer = HiGHS.Optimizer, variable_names = true)
|
model = RELOG.build_model(instance, optimizer = HiGHS.Optimizer, variable_names = true)
|
||||||
y = model[:y]
|
y = model[:y]
|
||||||
@@ -110,10 +110,3 @@ function model_build_test_1()
|
|||||||
"eq_disposal_limit[C1,P2,1] : z_disp[C1,P2,1] ≤ 0"
|
"eq_disposal_limit[C1,P2,1] : z_disp[C1,P2,1] ≤ 0"
|
||||||
@test ("C1", "P3", 1) ∉ keys(model[:eq_disposal_limit])
|
@test ("C1", "P3", 1) ∉ keys(model[:eq_disposal_limit])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function model_build_test_2()
|
|
||||||
instance = RELOG.parsefile(fixture("boat_example.json"))
|
|
||||||
model = RELOG.build_model(instance, optimizer = HiGHS.Optimizer)
|
|
||||||
optimize!(model)
|
|
||||||
end
|
|
||||||
|
|||||||
12
test/src/reports_test.jl
Normal file
12
test/src/reports_test.jl
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
function report_tests()
|
||||||
|
# Load and solve the boat example
|
||||||
|
instance = RELOG.parsefile(fixture("boat_example.json"))
|
||||||
|
model = RELOG.build_model(instance, optimizer = HiGHS.Optimizer, variable_names = true)
|
||||||
|
optimize!(model)
|
||||||
|
write_to_file(model, "tmp/model.lp")
|
||||||
|
RELOG.write_plants_report(model, "tmp/plants.csv")
|
||||||
|
RELOG.write_plant_outputs_report(model, "tmp/plant_outputs.csv")
|
||||||
|
RELOG.write_centers_report(model, "tmp/centers.csv")
|
||||||
|
RELOG.write_center_outputs_report(model, "tmp/center_outputs.csv")
|
||||||
|
RELOG.write_transportation_report(model, "tmp/transportation.csv")
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user