From 481f5a904ce8b612d3e9b968956a3b242f6817a1 Mon Sep 17 00:00:00 2001 From: oyurdakul Date: Mon, 6 Mar 2023 17:03:34 -0600 Subject: [PATCH] read and repair scenario --- src/UnitCommitment.jl | 4 + src/instance/read.jl | 85 ++++++++++++------- src/instance/structs.jl | 8 +- src/model/build.jl | 2 +- src/transform/randomize/XavQiuAhm2021.jl | 6 +- .../transform/randomize/XavQiuAhm2021_test.jl | 6 +- 6 files changed, 67 insertions(+), 44 deletions(-) diff --git a/src/UnitCommitment.jl b/src/UnitCommitment.jl index 87e45d5..81989ee 100644 --- a/src/UnitCommitment.jl +++ b/src/UnitCommitment.jl @@ -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") diff --git a/src/instance/read.jl b/src/instance/read.jl index 935d774..7a7e947 100644 --- a/src/instance/read.jl +++ b/src/instance/read.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}() diff --git a/src/instance/structs.jl b/src/instance/structs.jl index 445a9c3..1760114 100644 --- a/src/instance/structs.jl +++ b/src/instance/structs.jl @@ -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} diff --git a/src/model/build.jl b/src/model/build.jl index d78e75f..fdfc27e 100644 --- a/src/model/build.jl +++ b/src/model/build.jl @@ -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 diff --git a/src/transform/randomize/XavQiuAhm2021.jl b/src/transform/randomize/XavQiuAhm2021.jl index a8ed08e..b60cafd 100644 --- a/src/transform/randomize/XavQiuAhm2021.jl +++ b/src/transform/randomize/XavQiuAhm2021.jl @@ -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 diff --git a/test/transform/randomize/XavQiuAhm2021_test.jl b/test/transform/randomize/XavQiuAhm2021_test.jl index 1717e21..1322b19 100644 --- a/test/transform/randomize/XavQiuAhm2021_test.jl +++ b/test/transform/randomize/XavQiuAhm2021_test.jl @@ -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), )