mirror of
https://github.com/ANL-CEEESA/UnitCommitment.jl.git
synced 2025-12-09 01:28:51 -06:00
Make test/ a standalone project
This commit is contained in:
30
test/src/transform/initcond_test.jl
Normal file
30
test/src/transform/initcond_test.jl
Normal file
@@ -0,0 +1,30 @@
|
||||
# UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment
|
||||
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||
# Released under the modified BSD license. See COPYING.md for more details.
|
||||
|
||||
using UnitCommitment, Cbc, JuMP
|
||||
|
||||
function transform_initcond_test()
|
||||
@testset "generate_initial_conditions!" begin
|
||||
# Load instance
|
||||
instance = UnitCommitment.read(fixture("case118-initcond.json.gz"))
|
||||
optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0)
|
||||
sc = instance.scenarios[1]
|
||||
# All units should have unknown initial conditions
|
||||
for g in sc.thermal_units
|
||||
@test g.initial_power === nothing
|
||||
@test g.initial_status === nothing
|
||||
end
|
||||
|
||||
# Generate initial conditions
|
||||
UnitCommitment.generate_initial_conditions!(sc, optimizer)
|
||||
|
||||
# All units should now have known initial conditions
|
||||
for g in sc.thermal_units
|
||||
@test g.initial_power !== nothing
|
||||
@test g.initial_status !== nothing
|
||||
end
|
||||
|
||||
# TODO: Check that initial conditions are feasible
|
||||
end
|
||||
end
|
||||
106
test/src/transform/randomize/XavQiuAhm2021_test.jl
Normal file
106
test/src/transform/randomize/XavQiuAhm2021_test.jl
Normal file
@@ -0,0 +1,106 @@
|
||||
# UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment
|
||||
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||
# Released under the modified BSD license. See COPYING.md for more details.
|
||||
|
||||
import Random
|
||||
import UnitCommitment: XavQiuAhm2021
|
||||
|
||||
using Distributions
|
||||
using Random
|
||||
using UnitCommitment, Cbc, JuMP
|
||||
|
||||
function get_scenario()
|
||||
return UnitCommitment.read_benchmark(
|
||||
"matpower/case118/2017-02-01",
|
||||
).scenarios[1]
|
||||
end
|
||||
system_load(sc) = sum(b.load for b in sc.buses)
|
||||
test_approx(x, y) = @test isapprox(x, y, atol = 1e-3)
|
||||
|
||||
function transform_randomize_XavQiuAhm2021_test()
|
||||
@testset "XavQiuAhm2021" begin
|
||||
@testset "cost and load share" begin
|
||||
sc = get_scenario()
|
||||
# Check original costs
|
||||
unit = sc.thermal_units[10]
|
||||
test_approx(unit.min_power_cost[1], 825.023)
|
||||
test_approx(unit.cost_segments[1].cost[1], 36.659)
|
||||
test_approx(unit.startup_categories[1].cost[1], 7570.42)
|
||||
|
||||
# Check original load share
|
||||
bus = sc.buses[1]
|
||||
prev_system_load = system_load(sc)
|
||||
test_approx(bus.load[1] / prev_system_load[1], 0.012)
|
||||
|
||||
randomize!(
|
||||
sc,
|
||||
XavQiuAhm2021.Randomization(randomize_load_profile = false),
|
||||
rng = MersenneTwister(42),
|
||||
)
|
||||
|
||||
# Check randomized costs
|
||||
test_approx(unit.min_power_cost[1], 831.977)
|
||||
test_approx(unit.cost_segments[1].cost[1], 36.968)
|
||||
test_approx(unit.startup_categories[1].cost[1], 7634.226)
|
||||
|
||||
# Check randomized load share
|
||||
curr_system_load = system_load(sc)
|
||||
test_approx(bus.load[1] / curr_system_load[1], 0.013)
|
||||
|
||||
# System load should not change
|
||||
@test prev_system_load ≈ curr_system_load
|
||||
end
|
||||
|
||||
@testset "load profile" begin
|
||||
sc = get_scenario()
|
||||
# Check original load profile
|
||||
@test round.(system_load(sc), digits = 1)[1:8] ≈ [
|
||||
3059.5,
|
||||
2983.2,
|
||||
2937.5,
|
||||
2953.9,
|
||||
3073.1,
|
||||
3356.4,
|
||||
4068.5,
|
||||
4018.8,
|
||||
]
|
||||
|
||||
randomize!(
|
||||
sc,
|
||||
XavQiuAhm2021.Randomization();
|
||||
rng = MersenneTwister(42),
|
||||
)
|
||||
|
||||
# Check randomized load profile
|
||||
@test round.(system_load(sc), digits = 1)[1:8] ≈ [
|
||||
4854.7,
|
||||
4849.2,
|
||||
4732.7,
|
||||
4848.2,
|
||||
4948.4,
|
||||
5231.1,
|
||||
5874.8,
|
||||
5934.8,
|
||||
]
|
||||
end
|
||||
|
||||
@testset "profiled unit cost" begin
|
||||
sc = UnitCommitment.read(
|
||||
fixture("case14-profiled.json.gz"),
|
||||
).scenarios[1]
|
||||
# Check original costs
|
||||
pu1 = sc.profiled_units[1]
|
||||
pu2 = sc.profiled_units[2]
|
||||
test_approx(pu1.cost[1], 100.0)
|
||||
test_approx(pu2.cost[1], 50.0)
|
||||
randomize!(
|
||||
sc,
|
||||
XavQiuAhm2021.Randomization(randomize_load_profile = false),
|
||||
rng = MersenneTwister(42),
|
||||
)
|
||||
# Check randomized costs
|
||||
test_approx(pu1.cost[1], 98.039)
|
||||
test_approx(pu2.cost[1], 48.385)
|
||||
end
|
||||
end
|
||||
end
|
||||
68
test/src/transform/slice_test.jl
Normal file
68
test/src/transform/slice_test.jl
Normal file
@@ -0,0 +1,68 @@
|
||||
# UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment
|
||||
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||
# Released under the modified BSD license. See COPYING.md for more details.
|
||||
|
||||
using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip
|
||||
|
||||
function transform_slice_test()
|
||||
@testset "slice" begin
|
||||
instance = UnitCommitment.read(fixture("case14.json.gz"))
|
||||
modified = UnitCommitment.slice(instance, 1:2)
|
||||
sc = modified.scenarios[1]
|
||||
|
||||
# Should update all time-dependent fields
|
||||
@test modified.time == 2
|
||||
@test length(sc.power_balance_penalty) == 2
|
||||
@test length(sc.reserves_by_name["r1"].amount) == 2
|
||||
for u in sc.thermal_units
|
||||
@test length(u.max_power) == 2
|
||||
@test length(u.min_power) == 2
|
||||
@test length(u.must_run) == 2
|
||||
@test length(u.min_power_cost) == 2
|
||||
for s in u.cost_segments
|
||||
@test length(s.mw) == 2
|
||||
@test length(s.cost) == 2
|
||||
end
|
||||
end
|
||||
for b in sc.buses
|
||||
@test length(b.load) == 2
|
||||
end
|
||||
for l in sc.lines
|
||||
@test length(l.normal_flow_limit) == 2
|
||||
@test length(l.emergency_flow_limit) == 2
|
||||
@test length(l.flow_limit_penalty) == 2
|
||||
end
|
||||
for ps in sc.price_sensitive_loads
|
||||
@test length(ps.demand) == 2
|
||||
@test length(ps.revenue) == 2
|
||||
end
|
||||
|
||||
# Should be able to build model without errors
|
||||
optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0)
|
||||
model = UnitCommitment.build_model(
|
||||
instance = modified,
|
||||
optimizer = optimizer,
|
||||
variable_names = true,
|
||||
)
|
||||
end
|
||||
|
||||
@testset "slice profiled units" begin
|
||||
instance = UnitCommitment.read(fixture("case14-profiled.json.gz"))
|
||||
modified = UnitCommitment.slice(instance, 1:2)
|
||||
sc = modified.scenarios[1]
|
||||
|
||||
# Should update all time-dependent fields
|
||||
for pu in sc.profiled_units
|
||||
@test length(pu.max_power) == 2
|
||||
@test length(pu.min_power) == 2
|
||||
end
|
||||
|
||||
# Should be able to build model without errors
|
||||
optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0)
|
||||
model = UnitCommitment.build_model(
|
||||
instance = modified,
|
||||
optimizer = optimizer,
|
||||
variable_names = true,
|
||||
)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user