From 5c3f7b15d31ec04ab352e6dfebd331394893993a Mon Sep 17 00:00:00 2001 From: Alinson S Xavier Date: Thu, 19 Aug 2021 07:07:25 -0500 Subject: [PATCH] UnitCommitmentInstance: add _by_name fields --- src/instance/read.jl | 23 ++++++++++++++--------- src/instance/structs.jl | 20 ++++++++++++-------- test/instance/read_test.jl | 6 ++++++ 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/instance/read.jl b/src/instance/read.jl index 01573f7..7f89838 100644 --- a/src/instance/read.jl +++ b/src/instance/read.jl @@ -266,15 +266,20 @@ function _from_json(json; repair = true) end instance = UnitCommitmentInstance( - T, - power_balance_penalty, - shortfall_penalty, - units, - buses, - lines, - reserves, - contingencies, - loads, + buses_by_name = Dict(b.name => b for b in buses), + buses = buses, + contingencies_by_name = Dict(c.name => c for c in contingencies), + contingencies = contingencies, + lines_by_name = Dict(l.name => l for l in lines), + lines = lines, + power_balance_penalty = power_balance_penalty, + price_sensitive_loads_by_name = Dict(ps.name => ps for ps in loads), + price_sensitive_loads = loads, + reserves = reserves, + shortfall_penalty = shortfall_penalty, + time = T, + units_by_name = Dict(g.name => g for g in units), + units = units, ) if repair UnitCommitment.repair!(instance) diff --git a/src/instance/structs.jl b/src/instance/structs.jl index bf7360c..1e4cd5c 100644 --- a/src/instance/structs.jl +++ b/src/instance/structs.jl @@ -69,17 +69,21 @@ mutable struct PriceSensitiveLoad revenue::Vector{Float64} end -mutable struct UnitCommitmentInstance - time::Int - power_balance_penalty::Vector{Float64} - "Penalty for failing to meet reserve requirement." - shortfall_penalty::Vector{Float64} - units::Vector{Unit} +Base.@kwdef mutable struct UnitCommitmentInstance + buses_by_name::Dict{AbstractString,Bus} buses::Vector{Bus} - lines::Vector{TransmissionLine} - reserves::Reserves + contingencies_by_name::Dict{AbstractString,Contingency} contingencies::Vector{Contingency} + lines_by_name::Dict{AbstractString,TransmissionLine} + lines::Vector{TransmissionLine} + power_balance_penalty::Vector{Float64} + price_sensitive_loads_by_name::Dict{AbstractString,PriceSensitiveLoad} price_sensitive_loads::Vector{PriceSensitiveLoad} + reserves::Reserves + shortfall_penalty::Vector{Float64} + time::Int + units_by_name::Dict{AbstractString,Unit} + units::Vector{Unit} end function Base.show(io::IO, instance::UnitCommitmentInstance) diff --git a/test/instance/read_test.jl b/test/instance/read_test.jl index 915a5c8..676a808 100644 --- a/test/instance/read_test.jl +++ b/test/instance/read_test.jl @@ -22,6 +22,7 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip @test instance.lines[5].normal_flow_limit == [1e8 for t in 1:4] @test instance.lines[5].emergency_flow_limit == [1e8 for t in 1:4] @test instance.lines[5].flow_limit_penalty == [5e3 for t in 1:4] + @test instance.lines_by_name["l5"].name == "l5" @test instance.lines[1].name == "l1" @test instance.lines[1].source.name == "b1" @@ -34,6 +35,7 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip @test instance.buses[9].name == "b9" @test instance.buses[9].load == [35.36638, 33.25495, 31.67138, 31.14353] + @test instance.buses_by_name["b9"].name == "b9" unit = instance.units[1] @test unit.name == "g1" @@ -62,6 +64,7 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip @test unit.startup_categories[1].cost == 1000.0 @test unit.startup_categories[2].cost == 1500.0 @test unit.startup_categories[3].cost == 2000.0 + @test instance.units_by_name["g1"].name == "g1" unit = instance.units[2] @test unit.name == "g2" @@ -92,12 +95,15 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip @test instance.contingencies[1].lines == [instance.lines[1]] @test instance.contingencies[1].units == [] + @test instance.contingencies[1].name == "c1" + @test instance.contingencies_by_name["c1"].name == "c1" load = instance.price_sensitive_loads[1] @test load.name == "ps1" @test load.bus.name == "b3" @test load.revenue == [100.0 for t in 1:4] @test load.demand == [50.0 for t in 1:4] + @test instance.price_sensitive_loads_by_name["ps1"].name == "ps1" end @testset "read_benchmark sub-hourly" begin