mirror of
https://github.com/ANL-CEEESA/UnitCommitment.jl.git
synced 2025-12-07 00:38:51 -06:00
stochastic extension w/ scenarios
This commit is contained in:
@@ -7,6 +7,7 @@ using JSON
|
||||
using DataStructures
|
||||
using GZip
|
||||
import Base: getindex, time
|
||||
using Glob
|
||||
|
||||
const INSTANCES_URL = "https://axavier.org/UnitCommitment.jl/0.3/instances"
|
||||
|
||||
@@ -43,6 +44,25 @@ function read_benchmark(
|
||||
return UnitCommitment.read(filename)
|
||||
end
|
||||
|
||||
function read_scenarios(path::AbstractString)::UnitCommitmentInstance
|
||||
scenario_paths = glob("*.json", path)
|
||||
scenarios = Vector{UnitCommitmentScenario}()
|
||||
total_number_of_scenarios = length(scenario_paths)
|
||||
for (scenario_index, scenario_path) in enumerate(scenario_paths)
|
||||
scenario = read_scenario(scenario_path,
|
||||
total_number_of_scenarios = total_number_of_scenarios,
|
||||
scenario_index = scenario_index)
|
||||
push!(scenarios, scenario)
|
||||
end
|
||||
instance = UnitCommitmentInstance(
|
||||
time = scenarios[1].time,
|
||||
scenarios = scenarios
|
||||
)
|
||||
abs(sum(scenario.probability for scenario in instance.scenarios) - 1.0) <= 0.01 ||
|
||||
error("scenario probabilities do not add up to one")
|
||||
return instance
|
||||
end
|
||||
|
||||
"""
|
||||
read(path::AbstractString)::UnitCommitmentInstance
|
||||
|
||||
@@ -54,18 +74,33 @@ Read instance from a file. The file may be gzipped.
|
||||
instance = UnitCommitment.read("/path/to/input.json.gz")
|
||||
```
|
||||
"""
|
||||
function read(path::AbstractString)::UnitCommitmentInstance
|
||||
function read_scenario(path::AbstractString; total_number_of_scenarios = 1, scenario_index = 1)::UnitCommitmentScenario
|
||||
if endswith(path, ".gz")
|
||||
return _read(gzopen(path))
|
||||
return _read(gzopen(path),total_number_of_scenarios, scenario_index)
|
||||
else
|
||||
return _read(open(path))
|
||||
return _read(open(path), total_number_of_scenarios, scenario_index)
|
||||
end
|
||||
end
|
||||
|
||||
function _read(file::IO)::UnitCommitmentInstance
|
||||
function read(path::AbstractString; total_number_of_scenarios = 1, scenario_index = 1)::UnitCommitmentInstance
|
||||
if endswith(path, ".gz")
|
||||
scenario = _read(gzopen(path),total_number_of_scenarios, scenario_index)
|
||||
else
|
||||
scenario = _read(open(path), total_number_of_scenarios, scenario_index)
|
||||
end
|
||||
instance = UnitCommitmentInstance(
|
||||
time = scenario.time,
|
||||
scenarios = [scenario]
|
||||
)
|
||||
return instance
|
||||
end
|
||||
|
||||
function _read(file::IO, total_number_of_scenarios::Int, scenario_index::Int)::UnitCommitmentScenario
|
||||
return _from_json(
|
||||
JSON.parse(file, dicttype = () -> DefaultOrderedDict(nothing)),
|
||||
)
|
||||
total_number_of_scenarios,
|
||||
scenario_index
|
||||
)
|
||||
end
|
||||
|
||||
function _read_json(path::String)::OrderedDict
|
||||
@@ -77,7 +112,7 @@ function _read_json(path::String)::OrderedDict
|
||||
return JSON.parse(file, dicttype = () -> DefaultOrderedDict(nothing))
|
||||
end
|
||||
|
||||
function _from_json(json; repair = true)
|
||||
function _from_json(json, total_number_of_scenarios::Int, scenario_index::Int; repair = true)::UnitCommitmentScenario
|
||||
_migrate(json)
|
||||
units = Unit[]
|
||||
buses = Bus[]
|
||||
@@ -101,6 +136,17 @@ function _from_json(json; repair = true)
|
||||
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"]
|
||||
if probability === nothing
|
||||
probability = (1 / total_number_of_scenarios)
|
||||
end
|
||||
scenario_name = json["Parameters"]["Scenario name"]
|
||||
if scenario_name === nothing
|
||||
scenario_name = "s$(scenario_index)"
|
||||
end
|
||||
|
||||
######
|
||||
|
||||
name_to_bus = Dict{String,Bus}()
|
||||
name_to_line = Dict{String,TransmissionLine}()
|
||||
@@ -308,7 +354,9 @@ function _from_json(json; repair = true)
|
||||
end
|
||||
end
|
||||
|
||||
instance = UnitCommitmentInstance(
|
||||
scenario = UnitCommitmentScenario(
|
||||
name = scenario_name,
|
||||
probability = probability,
|
||||
buses_by_name = Dict(b.name => b for b in buses),
|
||||
buses = buses,
|
||||
contingencies_by_name = Dict(c.name => c for c in contingencies),
|
||||
@@ -320,14 +368,16 @@ function _from_json(json; repair = true)
|
||||
price_sensitive_loads = loads,
|
||||
reserves = reserves,
|
||||
reserves_by_name = name_to_reserve,
|
||||
shortfall_penalty = shortfall_penalty,
|
||||
flexiramp_shortfall_penalty = flexiramp_shortfall_penalty,
|
||||
# shortfall_penalty = shortfall_penalty,
|
||||
# flexiramp_shortfall_penalty = flexiramp_shortfall_penalty,
|
||||
time = T,
|
||||
units_by_name = Dict(g.name => g for g in units),
|
||||
units = units,
|
||||
isf = spzeros(Float64, length(lines), length(buses) - 1),
|
||||
lodf = spzeros(Float64, length(lines), length(lines))
|
||||
)
|
||||
if repair
|
||||
UnitCommitment.repair!(instance)
|
||||
UnitCommitment.repair!(scenario)
|
||||
end
|
||||
return instance
|
||||
return scenario
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user