mirror of
https://github.com/ANL-CEEESA/UnitCommitment.jl.git
synced 2025-12-06 00:08:52 -06:00
read and repair scenario
This commit is contained in:
@@ -4,6 +4,10 @@
|
||||
|
||||
module UnitCommitment
|
||||
|
||||
function hello()
|
||||
@show "Hello 2"
|
||||
end
|
||||
|
||||
using Base: String
|
||||
include("instance/structs.jl")
|
||||
include("model/formulations/base/structs.jl")
|
||||
|
||||
@@ -57,48 +57,65 @@ instance = UnitCommitment.read("/path/to/input.json.gz")
|
||||
"""
|
||||
|
||||
function _repair_scenario_name_and_probability(
|
||||
sc::UnitCommitmentScenario,
|
||||
path::String,
|
||||
number_of_scenarios::Int,
|
||||
)::UnitCommitmentScenario
|
||||
sc.name !== nothing || (sc.name = first(split(last(split(path, "/")), ".")))
|
||||
sc.probability !== nothing || (sc.probability = (1 / number_of_scenarios))
|
||||
return sc
|
||||
end
|
||||
|
||||
function read(path)::UnitCommitmentInstance
|
||||
scenarios = Vector{UnitCommitmentScenario}()
|
||||
if (endswith(path, ".gz") || endswith(path, ".json"))
|
||||
endswith(path, ".gz") ? (scenario = _read(gzopen(path))) :
|
||||
(scenario = _read(open(path)))
|
||||
scenario = _repair_scenario_name_and_probability(scenario, "s1", 1)
|
||||
scenarios = [scenario]
|
||||
elseif typeof(path) == Vector{String}
|
||||
number_of_scenarios = length(paths)
|
||||
for scenario_path in path
|
||||
if endswith(scenario_path, ".gz")
|
||||
scenario = _read(gzopen(scenario_path))
|
||||
elseif endswith(scenario_path, ".json")
|
||||
scenario = _read(open(scenario_path))
|
||||
else
|
||||
error("Unsupported input format")
|
||||
scenarios::Vector{UnitCommitmentScenario},
|
||||
path::Vector{String}
|
||||
)::Vector{UnitCommitmentScenario}
|
||||
number_of_scenarios = length(scenarios)
|
||||
probs = [sc.probability for sc in scenarios]
|
||||
total_weight = number_of_scenarios
|
||||
if Float64 in typeof.(probs)
|
||||
try
|
||||
total_weight = sum(probs)
|
||||
catch e
|
||||
if isa(e, MethodError)
|
||||
error("If any of the scenarios is assigned a weight, then all scenarios must be assigned weights.")
|
||||
end
|
||||
scenario = _repair_scenario_name_and_probability(
|
||||
scenario,
|
||||
scenario_path,
|
||||
number_of_scenarios,
|
||||
)
|
||||
push!(scenarios, scenario)
|
||||
end
|
||||
else
|
||||
error("Unsupported input format")
|
||||
[sc.probability = 1 for sc in scenarios]
|
||||
end
|
||||
|
||||
for (sc_path, sc) in zip(path, scenarios)
|
||||
sc.name !== "" || (sc.name = first(split(last(split(sc_path, "/")), ".")))
|
||||
sc.probability = (sc.probability / total_weight)
|
||||
end
|
||||
return scenarios
|
||||
end
|
||||
|
||||
function read(path::String)::UnitCommitmentInstance
|
||||
scenarios = Vector{UnitCommitmentScenario}()
|
||||
scenario = _read_scenario(path)
|
||||
scenario.name = "s1"
|
||||
scenario.probability = 1.0
|
||||
scenarios = [scenario]
|
||||
instance =
|
||||
UnitCommitmentInstance(time = scenario.time, scenarios = scenarios)
|
||||
return instance
|
||||
end
|
||||
|
||||
function read(path::Vector{String})::UnitCommitmentInstance
|
||||
scenarios = Vector{UnitCommitmentScenario}()
|
||||
for scenario_path in path
|
||||
scenario = _read_scenario(scenario_path)
|
||||
push!(scenarios, scenario)
|
||||
end
|
||||
scenarios = _repair_scenario_name_and_probability(scenarios, path)
|
||||
instance =
|
||||
UnitCommitmentInstance(time = scenarios[1].time, scenarios = scenarios)
|
||||
return instance
|
||||
end
|
||||
|
||||
function _read_scenario(path::String)::UnitCommitmentScenario
|
||||
if endswith(path, ".gz")
|
||||
scenario = _read(gzopen(path))
|
||||
elseif endswith(path, ".json")
|
||||
scenario = _read(open(path))
|
||||
else
|
||||
error("Unsupported input format")
|
||||
end
|
||||
return scenario
|
||||
end
|
||||
|
||||
function _read(file::IO)::UnitCommitmentScenario
|
||||
return _from_json(
|
||||
JSON.parse(file, dicttype = () -> DefaultOrderedDict(nothing)),
|
||||
@@ -138,8 +155,10 @@ function _from_json(json; repair = true)::UnitCommitmentScenario
|
||||
error("Time step $time_step is not a divisor of 60")
|
||||
time_multiplier = 60 ÷ time_step
|
||||
T = time_horizon * time_multiplier
|
||||
probability = json["Parameters"]["Scenario probability"]
|
||||
probability = nothing
|
||||
probability = json["Parameters"]["Scenario weight"]
|
||||
scenario_name = json["Parameters"]["Scenario name"]
|
||||
scenario_name !== nothing || (scenario_name = "")
|
||||
name_to_bus = Dict{String,Bus}()
|
||||
name_to_line = Dict{String,TransmissionLine}()
|
||||
name_to_unit = Dict{String,Unit}()
|
||||
|
||||
@@ -30,9 +30,9 @@ end
|
||||
|
||||
mutable struct Unit
|
||||
name::String
|
||||
bus::Bus
|
||||
bus::Bus
|
||||
max_power::Vector{Float64}
|
||||
min_power::Vector{Float64}
|
||||
min_power::Vector{Float64}
|
||||
must_run::Vector{Bool}
|
||||
min_power_cost::Vector{Float64}
|
||||
cost_segments::Vector{CostSegment}
|
||||
@@ -74,8 +74,8 @@ mutable struct PriceSensitiveLoad
|
||||
end
|
||||
|
||||
Base.@kwdef mutable struct UnitCommitmentScenario
|
||||
name::Any
|
||||
probability::Any
|
||||
name::String
|
||||
probability::Union{Float64,Nothing}
|
||||
buses_by_name::Dict{AbstractString,Bus}
|
||||
buses::Vector{Bus}
|
||||
contingencies_by_name::Dict{AbstractString,Contingency}
|
||||
|
||||
@@ -81,7 +81,7 @@ function build_model(;
|
||||
_add_unit_commitment!(model, g, formulation)
|
||||
end
|
||||
for sc in instance.scenarios
|
||||
@info "Building scenario $(sc.name) with" *
|
||||
@info "Building scenario $(sc.name) with " *
|
||||
"probability $(sc.probability)"
|
||||
_setup_transmission(formulation.transmission, sc)
|
||||
for l in sc.lines
|
||||
|
||||
@@ -200,14 +200,14 @@ function randomize!(
|
||||
rng = MersenneTwister(),
|
||||
)::Nothing
|
||||
for sc in instance.scenarios
|
||||
randomize!(sc; method, rng)
|
||||
randomize!(sc, method; rng)
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
function randomize!(
|
||||
sc::UnitCommitment.UnitCommitmentScenario;
|
||||
method::XavQiuAhm2021.Randomization,
|
||||
sc::UnitCommitment.UnitCommitmentScenario,
|
||||
method::XavQiuAhm2021.Randomization;
|
||||
rng = MersenneTwister(),
|
||||
)::Nothing
|
||||
if method.randomize_costs
|
||||
|
||||
@@ -30,7 +30,7 @@ test_approx(x, y) = @test isapprox(x, y, atol = 1e-3)
|
||||
|
||||
randomize!(
|
||||
sc,
|
||||
method = XavQiuAhm2021.Randomization(
|
||||
XavQiuAhm2021.Randomization(
|
||||
randomize_load_profile = false,
|
||||
),
|
||||
rng = MersenneTwister(42),
|
||||
@@ -66,8 +66,8 @@ test_approx(x, y) = @test isapprox(x, y, atol = 1e-3)
|
||||
]
|
||||
|
||||
randomize!(
|
||||
sc;
|
||||
method = XavQiuAhm2021.Randomization(),
|
||||
sc,
|
||||
XavQiuAhm2021.Randomization();
|
||||
rng = MersenneTwister(42),
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user