Compare commits

..

1 Commits

Author SHA1 Message Date
e183a5d878 Implement randomization method from XavQiuAhm2021 2021-07-29 11:14:12 -05:00
12 changed files with 56 additions and 100 deletions

1
.gitignore vendored
View File

@@ -18,4 +18,3 @@ TODO.md
docs/_build docs/_build
.vscode .vscode
Manifest.toml Manifest.toml
*/Manifest.toml

View File

@@ -5,20 +5,23 @@
JULIA := julia --color=yes --project=@. JULIA := julia --color=yes --project=@.
VERSION := 0.2 VERSION := 0.2
build/sysimage.so: src/utils/sysimage.jl Project.toml build/sysimage.so: src/utils/sysimage.jl Project.toml Manifest.toml
julia --project=. -e "using Pkg; Pkg.instantiate()" mkdir -p build
julia --project=test -e "using Pkg; Pkg.instantiate()" mkdir -p benchmark/results/test
$(JULIA) src/utils/sysimage.jl test/runtests.jl cd benchmark; $(JULIA) --trace-compile=../build/precompile.jl benchmark.jl test/case14
$(JULIA) src/utils/sysimage.jl
clean: clean:
rm -rfv build rm -rf build/*
docs: docs:
cd docs; make clean; make dirhtml cd docs; make clean; make dirhtml
rsync -avP --delete-after docs/_build/dirhtml/ ../docs/$(VERSION)/ rsync -avP --delete-after docs/_build/dirhtml/ ../docs/$(VERSION)/
test: build/sysimage.so test: build/sysimage.so
$(JULIA) --sysimage build/sysimage.so test/runtests.jl @echo Running tests...
$(JULIA) --sysimage build/sysimage.so -e 'using Pkg; Pkg.test("UnitCommitment")' | tee build/test.log
format: format:
julia -e 'using JuliaFormatter; format(["src", "test", "benchmark"], verbose=true);' julia -e 'using JuliaFormatter; format(["src", "test", "benchmark"], verbose=true);'

View File

@@ -19,6 +19,7 @@ Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
[compat] [compat]
Cbc = "0.7"
DataStructures = "0.18" DataStructures = "0.18"
Distributions = "0.25" Distributions = "0.25"
GZip = "0.5" GZip = "0.5"
@@ -27,3 +28,11 @@ JuMP = "0.21"
MathOptInterface = "0.9" MathOptInterface = "0.9"
PackageCompiler = "1" PackageCompiler = "1"
julia = "1" julia = "1"
[extras]
Cbc = "9961bab8-2fa3-5c5a-9d89-47fab24efd76"
Gurobi = "2e9cd046-0924-5485-92f1-d5272153d98b"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
[targets]
test = ["Cbc", "Test", "Gurobi"]

View File

@@ -266,20 +266,15 @@ function _from_json(json; repair = true)
end end
instance = UnitCommitmentInstance( instance = UnitCommitmentInstance(
buses_by_name = Dict(b.name => b for b in buses), T,
buses = buses, power_balance_penalty,
contingencies_by_name = Dict(c.name => c for c in contingencies), shortfall_penalty,
contingencies = contingencies, units,
lines_by_name = Dict(l.name => l for l in lines), buses,
lines = lines, lines,
power_balance_penalty = power_balance_penalty, reserves,
price_sensitive_loads_by_name = Dict(ps.name => ps for ps in loads), contingencies,
price_sensitive_loads = loads, loads,
reserves = reserves,
shortfall_penalty = shortfall_penalty,
time = T,
units_by_name = Dict(g.name => g for g in units),
units = units,
) )
if repair if repair
UnitCommitment.repair!(instance) UnitCommitment.repair!(instance)

View File

@@ -69,21 +69,17 @@ mutable struct PriceSensitiveLoad
revenue::Vector{Float64} revenue::Vector{Float64}
end end
Base.@kwdef mutable struct UnitCommitmentInstance mutable struct UnitCommitmentInstance
buses_by_name::Dict{AbstractString,Bus}
buses::Vector{Bus}
contingencies_by_name::Dict{AbstractString,Contingency}
contingencies::Vector{Contingency}
lines_by_name::Dict{AbstractString,TransmissionLine}
lines::Vector{TransmissionLine}
power_balance_penalty::Vector{Float64}
price_sensitive_loads_by_name::Dict{AbstractString,PriceSensitiveLoad}
price_sensitive_loads::Vector{PriceSensitiveLoad}
reserves::Reserves
shortfall_penalty::Vector{Float64}
time::Int time::Int
units_by_name::Dict{AbstractString,Unit} power_balance_penalty::Vector{Float64}
"Penalty for failing to meet reserve requirement."
shortfall_penalty::Vector{Float64}
units::Vector{Unit} units::Vector{Unit}
buses::Vector{Bus}
lines::Vector{TransmissionLine}
reserves::Reserves
contingencies::Vector{Contingency}
price_sensitive_loads::Vector{PriceSensitiveLoad}
end end
function Base.show(io::IO, instance::UnitCommitmentInstance) function Base.show(io::IO, instance::UnitCommitmentInstance)

View File

@@ -3,31 +3,26 @@
# Released under the modified BSD license. See COPYING.md for more details. # Released under the modified BSD license. See COPYING.md for more details.
using PackageCompiler using PackageCompiler
using TOML
using Logging
Logging.disable_logging(Logging.Info) using DataStructures
mkpath("build") using Distributions
using JSON
using JuMP
using MathOptInterface
using SparseArrays
println("Generating precompilation statements...") pkg = [
run(`julia --project=. --trace-compile=build/precompile.jl $(ARGS)`) :DataStructures,
:Distributions,
:JSON,
:JuMP,
:MathOptInterface,
:SparseArrays,
]
println("Finding dependencies...") @info "Building system image..."
project = TOML.parsefile("Project.toml")
manifest = TOML.parsefile("Manifest.toml")
deps = Symbol[]
for dep in keys(project["deps"])
if "path" in keys(manifest[dep][1])
println(" - $(dep) [skip]")
else
println(" - $(dep)")
push!(deps, Symbol(dep))
end
end
println("Building system image...")
create_sysimage( create_sysimage(
deps, pkg,
precompile_statements_file = "build/precompile.jl", precompile_statements_file = "build/precompile.jl",
sysimage_path = "build/sysimage.so", sysimage_path = "build/sysimage.so",
) )

View File

@@ -1,26 +0,0 @@
[deps]
Cbc = "9961bab8-2fa3-5c5a-9d89-47fab24efd76"
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
GZip = "92fee26a-97fe-5a0c-ad85-20a5f3185b63"
Gurobi = "2e9cd046-0924-5485-92f1-d5272153d98b"
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
Logging = "56ddb016-857b-54e1-b83d-db4d58db5568"
MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee"
PackageCompiler = "9b87118b-4619-50d2-8e1e-99f35a4d4d9d"
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
[compat]
DataStructures = "0.18"
Distributions = "0.25"
GZip = "0.5"
JSON = "0.21"
JuMP = "0.21"
MathOptInterface = "0.9"
PackageCompiler = "1"
julia = "1"

View File

@@ -4,12 +4,9 @@
using UnitCommitment using UnitCommitment
basedir = @__DIR__
@testset "read_egret_solution" begin @testset "read_egret_solution" begin
solution = UnitCommitment.read_egret_solution( solution =
"$basedir/../fixtures/egret_output.json.gz", UnitCommitment.read_egret_solution("fixtures/egret_output.json.gz")
)
for attr in ["Is on", "Production (MW)", "Production cost (\$)"] for attr in ["Is on", "Production (MW)", "Production cost (\$)"]
@test attr in keys(solution) @test attr in keys(solution)
@test "115_STEAM_1" in keys(solution[attr]) @test "115_STEAM_1" in keys(solution[attr])

View File

@@ -22,7 +22,6 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip
@test instance.lines[5].normal_flow_limit == [1e8 for t in 1:4] @test instance.lines[5].normal_flow_limit == [1e8 for t in 1:4]
@test instance.lines[5].emergency_flow_limit == [1e8 for t in 1:4] @test instance.lines[5].emergency_flow_limit == [1e8 for t in 1:4]
@test instance.lines[5].flow_limit_penalty == [5e3 for t in 1:4] @test instance.lines[5].flow_limit_penalty == [5e3 for t in 1:4]
@test instance.lines_by_name["l5"].name == "l5"
@test instance.lines[1].name == "l1" @test instance.lines[1].name == "l1"
@test instance.lines[1].source.name == "b1" @test instance.lines[1].source.name == "b1"
@@ -35,7 +34,6 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip
@test instance.buses[9].name == "b9" @test instance.buses[9].name == "b9"
@test instance.buses[9].load == [35.36638, 33.25495, 31.67138, 31.14353] @test instance.buses[9].load == [35.36638, 33.25495, 31.67138, 31.14353]
@test instance.buses_by_name["b9"].name == "b9"
unit = instance.units[1] unit = instance.units[1]
@test unit.name == "g1" @test unit.name == "g1"
@@ -64,7 +62,6 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip
@test unit.startup_categories[1].cost == 1000.0 @test unit.startup_categories[1].cost == 1000.0
@test unit.startup_categories[2].cost == 1500.0 @test unit.startup_categories[2].cost == 1500.0
@test unit.startup_categories[3].cost == 2000.0 @test unit.startup_categories[3].cost == 2000.0
@test instance.units_by_name["g1"].name == "g1"
unit = instance.units[2] unit = instance.units[2]
@test unit.name == "g2" @test unit.name == "g2"
@@ -95,15 +92,12 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip
@test instance.contingencies[1].lines == [instance.lines[1]] @test instance.contingencies[1].lines == [instance.lines[1]]
@test instance.contingencies[1].units == [] @test instance.contingencies[1].units == []
@test instance.contingencies[1].name == "c1"
@test instance.contingencies_by_name["c1"].name == "c1"
load = instance.price_sensitive_loads[1] load = instance.price_sensitive_loads[1]
@test load.name == "ps1" @test load.name == "ps1"
@test load.bus.name == "b3" @test load.bus.name == "b3"
@test load.revenue == [100.0 for t in 1:4] @test load.revenue == [100.0 for t in 1:4]
@test load.demand == [50.0 for t in 1:4] @test load.demand == [50.0 for t in 1:4]
@test instance.price_sensitive_loads_by_name["ps1"].name == "ps1"
end end
@testset "read_benchmark sub-hourly" begin @testset "read_benchmark sub-hourly" begin

View File

@@ -5,7 +5,6 @@
using Test using Test
using UnitCommitment using UnitCommitment
push!(Base.LOAD_PATH, @__DIR__)
UnitCommitment._setup_logger() UnitCommitment._setup_logger()
const ENABLE_LARGE_TESTS = ("UCJL_LARGE_TESTS" in keys(ENV)) const ENABLE_LARGE_TESTS = ("UCJL_LARGE_TESTS" in keys(ENV))

View File

@@ -4,12 +4,9 @@
using UnitCommitment, Cbc, JuMP using UnitCommitment, Cbc, JuMP
basedir = @__DIR__
@testset "generate_initial_conditions!" begin @testset "generate_initial_conditions!" begin
# Load instance # Load instance
instance = instance = UnitCommitment.read("$(pwd())/fixtures/case118-initcond.json.gz")
UnitCommitment.read("$basedir/../fixtures/case118-initcond.json.gz")
optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0) optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0)
# All units should have unknown initial conditions # All units should have unknown initial conditions

View File

@@ -4,11 +4,9 @@
using UnitCommitment, JSON, GZip, DataStructures using UnitCommitment, JSON, GZip, DataStructures
basedir = @__DIR__
function parse_case14() function parse_case14()
return JSON.parse( return JSON.parse(
GZip.gzopen("$basedir/../../instances/test/case14.json.gz"), GZip.gzopen("../instances/test/case14.json.gz"),
dicttype = () -> DefaultOrderedDict(nothing), dicttype = () -> DefaultOrderedDict(nothing),
) )
end end