read and repair scenario

pull/25/head
oyurdakul 3 years ago
parent 7e8a2ee026
commit 481f5a904c

@ -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}()

@ -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),
)

Loading…
Cancel
Save