read and repair scenario

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

@ -4,6 +4,10 @@
module UnitCommitment module UnitCommitment
function hello()
@show "Hello 2"
end
using Base: String using Base: String
include("instance/structs.jl") include("instance/structs.jl")
include("model/formulations/base/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( function _repair_scenario_name_and_probability(
sc::UnitCommitmentScenario, scenarios::Vector{UnitCommitmentScenario},
path::String, path::Vector{String}
number_of_scenarios::Int, )::Vector{UnitCommitmentScenario}
)::UnitCommitmentScenario number_of_scenarios = length(scenarios)
sc.name !== nothing || (sc.name = first(split(last(split(path, "/")), "."))) probs = [sc.probability for sc in scenarios]
sc.probability !== nothing || (sc.probability = (1 / number_of_scenarios)) total_weight = number_of_scenarios
return sc if Float64 in typeof.(probs)
end try
total_weight = sum(probs)
function read(path)::UnitCommitmentInstance catch e
scenarios = Vector{UnitCommitmentScenario}() if isa(e, MethodError)
if (endswith(path, ".gz") || endswith(path, ".json")) error("If any of the scenarios is assigned a weight, then all scenarios must be assigned weights.")
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")
end end
scenario = _repair_scenario_name_and_probability(
scenario,
scenario_path,
number_of_scenarios,
)
push!(scenarios, scenario)
end end
else else
error("Unsupported input format") [sc.probability = 1 for sc in scenarios]
end 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 = instance =
UnitCommitmentInstance(time = scenarios[1].time, scenarios = scenarios) UnitCommitmentInstance(time = scenarios[1].time, scenarios = scenarios)
return instance return instance
end 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 function _read(file::IO)::UnitCommitmentScenario
return _from_json( return _from_json(
JSON.parse(file, dicttype = () -> DefaultOrderedDict(nothing)), 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") error("Time step $time_step is not a divisor of 60")
time_multiplier = 60 ÷ time_step time_multiplier = 60 ÷ time_step
T = time_horizon * time_multiplier 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 = json["Parameters"]["Scenario name"]
scenario_name !== nothing || (scenario_name = "")
name_to_bus = Dict{String,Bus}() name_to_bus = Dict{String,Bus}()
name_to_line = Dict{String,TransmissionLine}() name_to_line = Dict{String,TransmissionLine}()
name_to_unit = Dict{String,Unit}() name_to_unit = Dict{String,Unit}()

@ -74,8 +74,8 @@ mutable struct PriceSensitiveLoad
end end
Base.@kwdef mutable struct UnitCommitmentScenario Base.@kwdef mutable struct UnitCommitmentScenario
name::Any name::String
probability::Any probability::Union{Float64,Nothing}
buses_by_name::Dict{AbstractString,Bus} buses_by_name::Dict{AbstractString,Bus}
buses::Vector{Bus} buses::Vector{Bus}
contingencies_by_name::Dict{AbstractString,Contingency} contingencies_by_name::Dict{AbstractString,Contingency}

@ -81,7 +81,7 @@ function build_model(;
_add_unit_commitment!(model, g, formulation) _add_unit_commitment!(model, g, formulation)
end end
for sc in instance.scenarios for sc in instance.scenarios
@info "Building scenario $(sc.name) with" * @info "Building scenario $(sc.name) with " *
"probability $(sc.probability)" "probability $(sc.probability)"
_setup_transmission(formulation.transmission, sc) _setup_transmission(formulation.transmission, sc)
for l in sc.lines for l in sc.lines

@ -200,14 +200,14 @@ function randomize!(
rng = MersenneTwister(), rng = MersenneTwister(),
)::Nothing )::Nothing
for sc in instance.scenarios for sc in instance.scenarios
randomize!(sc; method, rng) randomize!(sc, method; rng)
end end
return return
end end
function randomize!( function randomize!(
sc::UnitCommitment.UnitCommitmentScenario; sc::UnitCommitment.UnitCommitmentScenario,
method::XavQiuAhm2021.Randomization, method::XavQiuAhm2021.Randomization;
rng = MersenneTwister(), rng = MersenneTwister(),
)::Nothing )::Nothing
if method.randomize_costs if method.randomize_costs

@ -30,7 +30,7 @@ test_approx(x, y) = @test isapprox(x, y, atol = 1e-3)
randomize!( randomize!(
sc, sc,
method = XavQiuAhm2021.Randomization( XavQiuAhm2021.Randomization(
randomize_load_profile = false, randomize_load_profile = false,
), ),
rng = MersenneTwister(42), rng = MersenneTwister(42),
@ -66,8 +66,8 @@ test_approx(x, y) = @test isapprox(x, y, atol = 1e-3)
] ]
randomize!( randomize!(
sc; sc,
method = XavQiuAhm2021.Randomization(), XavQiuAhm2021.Randomization();
rng = MersenneTwister(42), rng = MersenneTwister(42),
) )

Loading…
Cancel
Save