Minor changes to tests

pull/25/head
Alinson S. Xavier 3 years ago
parent 31e0613134
commit cb9334c0a3
Signed by: isoron
GPG Key ID: 0DA8E4B9E1109DCA

@ -6,17 +6,17 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip
@testset "read v0.2" begin @testset "read v0.2" begin
instance = UnitCommitment.read("$FIXTURES/ucjl-0.2.json.gz") instance = UnitCommitment.read("$FIXTURES/ucjl-0.2.json.gz")
for sc in instance.scenarios @test length(instance.scenarios) == 1
@test length(sc.reserves_by_name["r1"].amount) == 4 sc = instance.scenarios[1]
@test sc.units_by_name["g2"].reserves[1].name == "r1" @test length(sc.reserves_by_name["r1"].amount) == 4
end @test sc.units_by_name["g2"].reserves[1].name == "r1"
end end
@testset "read v0.3" begin @testset "read v0.3" begin
instance = UnitCommitment.read("$FIXTURES/ucjl-0.3.json.gz") instance = UnitCommitment.read("$FIXTURES/ucjl-0.3.json.gz")
for sc in instance.scenarios @test length(instance.scenarios) == 1
@test length(sc.units) == 6 sc = instance.scenarios[1]
@test length(sc.buses) == 14 @test length(sc.units) == 6
@test length(sc.lines) == 20 @test length(sc.buses) == 14
end @test length(sc.lines) == 20
end end

@ -6,110 +6,110 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip
@testset "read_benchmark" begin @testset "read_benchmark" begin
instance = UnitCommitment.read("$FIXTURES/case14.json.gz") instance = UnitCommitment.read("$FIXTURES/case14.json.gz")
for sc in instance.scenarios @test length(instance.scenarios) == 1
@test length(sc.lines) == 20 sc = instance.scenarios[1]
@test length(sc.buses) == 14 @test length(sc.lines) == 20
@test length(sc.units) == 6 @test length(sc.buses) == 14
@test length(sc.contingencies) == 19 @test length(sc.units) == 6
@test length(sc.price_sensitive_loads) == 1 @test length(sc.contingencies) == 19
@test instance.time == 4 @test length(sc.price_sensitive_loads) == 1
@test instance.time == 4
@test sc.lines[5].name == "l5" @test sc.lines[5].name == "l5"
@test sc.lines[5].source.name == "b2" @test sc.lines[5].source.name == "b2"
@test sc.lines[5].target.name == "b5" @test sc.lines[5].target.name == "b5"
@test sc.lines[5].reactance 0.17388 @test sc.lines[5].reactance 0.17388
@test sc.lines[5].susceptance 10.037550333 @test sc.lines[5].susceptance 10.037550333
@test sc.lines[5].normal_flow_limit == [1e8 for t in 1:4] @test sc.lines[5].normal_flow_limit == [1e8 for t in 1:4]
@test sc.lines[5].emergency_flow_limit == [1e8 for t in 1:4] @test sc.lines[5].emergency_flow_limit == [1e8 for t in 1:4]
@test sc.lines[5].flow_limit_penalty == [5e3 for t in 1:4] @test sc.lines[5].flow_limit_penalty == [5e3 for t in 1:4]
@test sc.lines_by_name["l5"].name == "l5" @test sc.lines_by_name["l5"].name == "l5"
@test sc.lines[1].name == "l1" @test sc.lines[1].name == "l1"
@test sc.lines[1].source.name == "b1" @test sc.lines[1].source.name == "b1"
@test sc.lines[1].target.name == "b2" @test sc.lines[1].target.name == "b2"
@test sc.lines[1].reactance 0.059170 @test sc.lines[1].reactance 0.059170
@test sc.lines[1].susceptance 29.496860773945 @test sc.lines[1].susceptance 29.496860773945
@test sc.lines[1].normal_flow_limit == [300.0 for t in 1:4] @test sc.lines[1].normal_flow_limit == [300.0 for t in 1:4]
@test sc.lines[1].emergency_flow_limit == [400.0 for t in 1:4] @test sc.lines[1].emergency_flow_limit == [400.0 for t in 1:4]
@test sc.lines[1].flow_limit_penalty == [1e3 for t in 1:4] @test sc.lines[1].flow_limit_penalty == [1e3 for t in 1:4]
@test sc.buses[9].name == "b9" @test sc.buses[9].name == "b9"
@test sc.buses[9].load == [35.36638, 33.25495, 31.67138, 31.14353] @test sc.buses[9].load == [35.36638, 33.25495, 31.67138, 31.14353]
@test sc.buses_by_name["b9"].name == "b9" @test sc.buses_by_name["b9"].name == "b9"
@test sc.reserves[1].name == "r1" @test sc.reserves[1].name == "r1"
@test sc.reserves[1].type == "spinning" @test sc.reserves[1].type == "spinning"
@test sc.reserves[1].amount == [100.0, 100.0, 100.0, 100.0] @test sc.reserves[1].amount == [100.0, 100.0, 100.0, 100.0]
@test sc.reserves_by_name["r1"].name == "r1" @test sc.reserves_by_name["r1"].name == "r1"
unit = sc.units[1] unit = sc.units[1]
@test unit.name == "g1" @test unit.name == "g1"
@test unit.bus.name == "b1" @test unit.bus.name == "b1"
@test unit.ramp_up_limit == 1e6 @test unit.ramp_up_limit == 1e6
@test unit.ramp_down_limit == 1e6 @test unit.ramp_down_limit == 1e6
@test unit.startup_limit == 1e6 @test unit.startup_limit == 1e6
@test unit.shutdown_limit == 1e6 @test unit.shutdown_limit == 1e6
@test unit.must_run == [false for t in 1:4] @test unit.must_run == [false for t in 1:4]
@test unit.min_power_cost == [1400.0 for t in 1:4] @test unit.min_power_cost == [1400.0 for t in 1:4]
@test unit.min_uptime == 1 @test unit.min_uptime == 1
@test unit.min_downtime == 1 @test unit.min_downtime == 1
for t in 1:1 for t in 1:1
@test unit.cost_segments[1].mw[t] == 10.0 @test unit.cost_segments[1].mw[t] == 10.0
@test unit.cost_segments[2].mw[t] == 20.0 @test unit.cost_segments[2].mw[t] == 20.0
@test unit.cost_segments[3].mw[t] == 5.0 @test unit.cost_segments[3].mw[t] == 5.0
@test unit.cost_segments[1].cost[t] 20.0 @test unit.cost_segments[1].cost[t] 20.0
@test unit.cost_segments[2].cost[t] 30.0 @test unit.cost_segments[2].cost[t] 30.0
@test unit.cost_segments[3].cost[t] 40.0 @test unit.cost_segments[3].cost[t] 40.0
end end
@test length(unit.startup_categories) == 3 @test length(unit.startup_categories) == 3
@test unit.startup_categories[1].delay == 1 @test unit.startup_categories[1].delay == 1
@test unit.startup_categories[2].delay == 2 @test unit.startup_categories[2].delay == 2
@test unit.startup_categories[3].delay == 3 @test unit.startup_categories[3].delay == 3
@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 length(unit.reserves) == 0 @test length(unit.reserves) == 0
@test sc.units_by_name["g1"].name == "g1" @test sc.units_by_name["g1"].name == "g1"
unit = sc.units[2] unit = sc.units[2]
@test unit.name == "g2" @test unit.name == "g2"
@test unit.must_run == [false for t in 1:4] @test unit.must_run == [false for t in 1:4]
@test length(unit.reserves) == 1 @test length(unit.reserves) == 1
unit = sc.units[3] unit = sc.units[3]
@test unit.name == "g3" @test unit.name == "g3"
@test unit.bus.name == "b3" @test unit.bus.name == "b3"
@test unit.ramp_up_limit == 70.0 @test unit.ramp_up_limit == 70.0
@test unit.ramp_down_limit == 70.0 @test unit.ramp_down_limit == 70.0
@test unit.startup_limit == 70.0 @test unit.startup_limit == 70.0
@test unit.shutdown_limit == 70.0 @test unit.shutdown_limit == 70.0
@test unit.must_run == [true for t in 1:4] @test unit.must_run == [true for t in 1:4]
@test unit.min_power_cost == [0.0 for t in 1:4] @test unit.min_power_cost == [0.0 for t in 1:4]
@test unit.min_uptime == 1 @test unit.min_uptime == 1
@test unit.min_downtime == 1 @test unit.min_downtime == 1
for t in 1:4 for t in 1:4
@test unit.cost_segments[1].mw[t] 33 @test unit.cost_segments[1].mw[t] 33
@test unit.cost_segments[2].mw[t] 33 @test unit.cost_segments[2].mw[t] 33
@test unit.cost_segments[3].mw[t] 34 @test unit.cost_segments[3].mw[t] 34
@test unit.cost_segments[1].cost[t] 33.75 @test unit.cost_segments[1].cost[t] 33.75
@test unit.cost_segments[2].cost[t] 38.04 @test unit.cost_segments[2].cost[t] 38.04
@test unit.cost_segments[3].cost[t] 44.77853 @test unit.cost_segments[3].cost[t] 44.77853
end end
@test length(unit.reserves) == 1 @test length(unit.reserves) == 1
@test unit.reserves[1].name == "r1" @test unit.reserves[1].name == "r1"
@test sc.contingencies[1].lines == [sc.lines[1]] @test sc.contingencies[1].lines == [sc.lines[1]]
@test sc.contingencies[1].units == [] @test sc.contingencies[1].units == []
@test sc.contingencies[1].name == "c1" @test sc.contingencies[1].name == "c1"
@test sc.contingencies_by_name["c1"].name == "c1" @test sc.contingencies_by_name["c1"].name == "c1"
load = sc.price_sensitive_loads[1] load = sc.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 sc.price_sensitive_loads_by_name["ps1"].name == "ps1" @test sc.price_sensitive_loads_by_name["ps1"].name == "ps1"
end
end end
@testset "read_benchmark sub-hourly" begin @testset "read_benchmark sub-hourly" begin

@ -7,78 +7,77 @@ import UnitCommitment: _Violation, _offer, _query
@testset "_ViolationFilter" begin @testset "_ViolationFilter" begin
instance = UnitCommitment.read("$FIXTURES/case14.json.gz") instance = UnitCommitment.read("$FIXTURES/case14.json.gz")
sc = instance.scenarios[1]
filter = UnitCommitment._ViolationFilter(max_per_line = 1, max_total = 2) filter = UnitCommitment._ViolationFilter(max_per_line = 1, max_total = 2)
for sc in instance.scenarios _offer(
_offer( filter,
filter, _Violation(
_Violation( time = 1,
time = 1, monitored_line = sc.lines[1],
monitored_line = sc.lines[1], outage_line = nothing,
outage_line = nothing, amount = 100.0,
amount = 100.0, ),
), )
) _offer(
_offer( filter,
filter, _Violation(
_Violation( time = 1,
time = 1, monitored_line = sc.lines[1],
monitored_line = sc.lines[1], outage_line = sc.lines[1],
outage_line = sc.lines[1], amount = 300.0,
amount = 300.0, ),
), )
) _offer(
_offer( filter,
filter, _Violation(
_Violation( time = 1,
time = 1, monitored_line = sc.lines[1],
monitored_line = sc.lines[1], outage_line = sc.lines[5],
outage_line = sc.lines[5], amount = 500.0,
amount = 500.0, ),
), )
) _offer(
_offer( filter,
filter, _Violation(
_Violation( time = 1,
time = 1, monitored_line = sc.lines[1],
monitored_line = sc.lines[1], outage_line = sc.lines[4],
outage_line = sc.lines[4], amount = 400.0,
amount = 400.0, ),
), )
) _offer(
_offer( filter,
filter, _Violation(
_Violation( time = 1,
time = 1, monitored_line = sc.lines[2],
monitored_line = sc.lines[2], outage_line = sc.lines[1],
outage_line = sc.lines[1], amount = 200.0,
amount = 200.0, ),
), )
) _offer(
_offer( filter,
filter, _Violation(
_Violation( time = 1,
time = 1, monitored_line = sc.lines[2],
monitored_line = sc.lines[2], outage_line = sc.lines[8],
outage_line = sc.lines[8], amount = 100.0,
amount = 100.0, ),
), )
)
actual = _query(filter) actual = _query(filter)
expected = [ expected = [
_Violation( _Violation(
time = 1, time = 1,
monitored_line = sc.lines[2], monitored_line = sc.lines[2],
outage_line = sc.lines[1], outage_line = sc.lines[1],
amount = 200.0, amount = 200.0,
), ),
_Violation( _Violation(
time = 1, time = 1,
monitored_line = sc.lines[1], monitored_line = sc.lines[1],
outage_line = sc.lines[5], outage_line = sc.lines[5],
amount = 500.0, amount = 500.0,
), ),
] ]
@test actual == expected @test actual == expected
end
end end

@ -7,32 +7,31 @@ import UnitCommitment: _Violation, _offer, _query
@testset "find_violations" begin @testset "find_violations" begin
instance = UnitCommitment.read("$FIXTURES/case14.json.gz") instance = UnitCommitment.read("$FIXTURES/case14.json.gz")
for sc in instance.scenarios sc = instance.scenarios[1]
for line in sc.lines, t in 1:instance.time for line in sc.lines, t in 1:instance.time
line.normal_flow_limit[t] = 1.0 line.normal_flow_limit[t] = 1.0
line.emergency_flow_limit[t] = 1.0 line.emergency_flow_limit[t] = 1.0
end
isf = UnitCommitment._injection_shift_factors(
lines = sc.lines,
buses = sc.buses,
)
lodf = UnitCommitment._line_outage_factors(
lines = sc.lines,
buses = sc.buses,
isf = isf,
)
inj = [1000.0 for b in 1:13, t in 1:instance.time]
overflow = [0.0 for l in sc.lines, t in 1:instance.time]
violations = UnitCommitment._find_violations(
instance = instance,
sc = sc,
net_injections = inj,
overflow = overflow,
isf = isf,
lodf = lodf,
max_per_line = 1,
max_per_period = 5,
)
@test length(violations) == 20
end end
isf = UnitCommitment._injection_shift_factors(
lines = sc.lines,
buses = sc.buses,
)
lodf = UnitCommitment._line_outage_factors(
lines = sc.lines,
buses = sc.buses,
isf = isf,
)
inj = [1000.0 for b in 1:13, t in 1:instance.time]
overflow = [0.0 for l in sc.lines, t in 1:instance.time]
violations = UnitCommitment._find_violations(
instance = instance,
sc = sc,
net_injections = inj,
overflow = overflow,
isf = isf,
lodf = lodf,
max_per_line = 1,
max_per_period = 5,
)
@test length(violations) == 20
end end

@ -6,145 +6,141 @@ using UnitCommitment, Test, LinearAlgebra
@testset "_susceptance_matrix" begin @testset "_susceptance_matrix" begin
instance = UnitCommitment.read("$FIXTURES/case14.json.gz") instance = UnitCommitment.read("$FIXTURES/case14.json.gz")
for sc in instance.scenarios sc = instance.scenarios[1]
actual = UnitCommitment._susceptance_matrix(sc.lines) actual = UnitCommitment._susceptance_matrix(sc.lines)
@test size(actual) == (20, 20) @test size(actual) == (20, 20)
expected = Diagonal([ expected = Diagonal([
29.5, 29.5,
7.83, 7.83,
8.82, 8.82,
9.9, 9.9,
10.04, 10.04,
10.2, 10.2,
41.45, 41.45,
8.35, 8.35,
3.14, 3.14,
6.93, 6.93,
8.77, 8.77,
6.82, 6.82,
13.4, 13.4,
9.91, 9.91,
15.87, 15.87,
20.65, 20.65,
6.46, 6.46,
9.09, 9.09,
8.73, 8.73,
5.02, 5.02,
]) ])
@test round.(actual, digits = 2) == expected @test round.(actual, digits = 2) == expected
end
end end
@testset "_reduced_incidence_matrix" begin @testset "_reduced_incidence_matrix" begin
instance = UnitCommitment.read("$FIXTURES/case14.json.gz") instance = UnitCommitment.read("$FIXTURES/case14.json.gz")
for sc in instance.scenarios sc = instance.scenarios[1]
actual = UnitCommitment._reduced_incidence_matrix( actual = UnitCommitment._reduced_incidence_matrix(
lines = sc.lines, lines = sc.lines,
buses = sc.buses, buses = sc.buses,
) )
@test size(actual) == (20, 13) @test size(actual) == (20, 13)
@test actual[1, 1] == -1.0 @test actual[1, 1] == -1.0
@test actual[3, 1] == 1.0 @test actual[3, 1] == 1.0
@test actual[4, 1] == 1.0 @test actual[4, 1] == 1.0
@test actual[5, 1] == 1.0 @test actual[5, 1] == 1.0
@test actual[3, 2] == -1.0 @test actual[3, 2] == -1.0
@test actual[6, 2] == 1.0 @test actual[6, 2] == 1.0
@test actual[4, 3] == -1.0 @test actual[4, 3] == -1.0
@test actual[6, 3] == -1.0 @test actual[6, 3] == -1.0
@test actual[7, 3] == 1.0 @test actual[7, 3] == 1.0
@test actual[8, 3] == 1.0 @test actual[8, 3] == 1.0
@test actual[9, 3] == 1.0 @test actual[9, 3] == 1.0
@test actual[2, 4] == -1.0 @test actual[2, 4] == -1.0
@test actual[5, 4] == -1.0 @test actual[5, 4] == -1.0
@test actual[7, 4] == -1.0 @test actual[7, 4] == -1.0
@test actual[10, 4] == 1.0 @test actual[10, 4] == 1.0
@test actual[10, 5] == -1.0 @test actual[10, 5] == -1.0
@test actual[11, 5] == 1.0 @test actual[11, 5] == 1.0
@test actual[12, 5] == 1.0 @test actual[12, 5] == 1.0
@test actual[13, 5] == 1.0 @test actual[13, 5] == 1.0
@test actual[8, 6] == -1.0 @test actual[8, 6] == -1.0
@test actual[14, 6] == 1.0 @test actual[14, 6] == 1.0
@test actual[15, 6] == 1.0 @test actual[15, 6] == 1.0
@test actual[14, 7] == -1.0 @test actual[14, 7] == -1.0
@test actual[9, 8] == -1.0 @test actual[9, 8] == -1.0
@test actual[15, 8] == -1.0 @test actual[15, 8] == -1.0
@test actual[16, 8] == 1.0 @test actual[16, 8] == 1.0
@test actual[17, 8] == 1.0 @test actual[17, 8] == 1.0
@test actual[16, 9] == -1.0 @test actual[16, 9] == -1.0
@test actual[18, 9] == 1.0 @test actual[18, 9] == 1.0
@test actual[11, 10] == -1.0 @test actual[11, 10] == -1.0
@test actual[18, 10] == -1.0 @test actual[18, 10] == -1.0
@test actual[12, 11] == -1.0 @test actual[12, 11] == -1.0
@test actual[19, 11] == 1.0 @test actual[19, 11] == 1.0
@test actual[13, 12] == -1.0 @test actual[13, 12] == -1.0
@test actual[19, 12] == -1.0 @test actual[19, 12] == -1.0
@test actual[20, 12] == 1.0 @test actual[20, 12] == 1.0
@test actual[17, 13] == -1.0 @test actual[17, 13] == -1.0
@test actual[20, 13] == -1.0 @test actual[20, 13] == -1.0
end
end end
@testset "_injection_shift_factors" begin @testset "_injection_shift_factors" begin
instance = UnitCommitment.read("$FIXTURES/case14.json.gz") instance = UnitCommitment.read("$FIXTURES/case14.json.gz")
for sc in instance.scenarios sc = instance.scenarios[1]
actual = UnitCommitment._injection_shift_factors( actual = UnitCommitment._injection_shift_factors(
lines = sc.lines, lines = sc.lines,
buses = sc.buses, buses = sc.buses,
) )
@test size(actual) == (20, 13) @test size(actual) == (20, 13)
@test round.(actual, digits = 2) == [ @test round.(actual, digits = 2) == [
-0.84 -0.75 -0.67 -0.61 -0.63 -0.66 -0.66 -0.65 -0.65 -0.64 -0.63 -0.63 -0.64 -0.84 -0.75 -0.67 -0.61 -0.63 -0.66 -0.66 -0.65 -0.65 -0.64 -0.63 -0.63 -0.64
-0.16 -0.25 -0.33 -0.39 -0.37 -0.34 -0.34 -0.35 -0.35 -0.36 -0.37 -0.37 -0.36 -0.16 -0.25 -0.33 -0.39 -0.37 -0.34 -0.34 -0.35 -0.35 -0.36 -0.37 -0.37 -0.36
0.03 -0.53 -0.15 -0.1 -0.12 -0.14 -0.14 -0.14 -0.13 -0.13 -0.12 -0.12 -0.13 0.03 -0.53 -0.15 -0.1 -0.12 -0.14 -0.14 -0.14 -0.13 -0.13 -0.12 -0.12 -0.13
0.06 -0.14 -0.32 -0.22 -0.25 -0.3 -0.3 -0.29 -0.28 -0.27 -0.25 -0.26 -0.27 0.06 -0.14 -0.32 -0.22 -0.25 -0.3 -0.3 -0.29 -0.28 -0.27 -0.25 -0.26 -0.27
0.08 -0.07 -0.2 -0.29 -0.26 -0.22 -0.22 -0.22 -0.23 -0.25 -0.26 -0.26 -0.24 0.08 -0.07 -0.2 -0.29 -0.26 -0.22 -0.22 -0.22 -0.23 -0.25 -0.26 -0.26 -0.24
0.03 0.47 -0.15 -0.1 -0.12 -0.14 -0.14 -0.14 -0.13 -0.13 -0.12 -0.12 -0.13 0.03 0.47 -0.15 -0.1 -0.12 -0.14 -0.14 -0.14 -0.13 -0.13 -0.12 -0.12 -0.13
0.08 0.31 0.5 -0.3 -0.03 0.36 0.36 0.28 0.23 0.1 -0.0 0.02 0.17 0.08 0.31 0.5 -0.3 -0.03 0.36 0.36 0.28 0.23 0.1 -0.0 0.02 0.17
0.0 0.01 0.02 -0.01 -0.22 -0.63 -0.63 -0.45 -0.41 -0.32 -0.24 -0.25 -0.36 0.0 0.01 0.02 -0.01 -0.22 -0.63 -0.63 -0.45 -0.41 -0.32 -0.24 -0.25 -0.36
0.0 0.01 0.01 -0.01 -0.12 -0.17 -0.17 -0.26 -0.24 -0.18 -0.14 -0.14 -0.21 0.0 0.01 0.01 -0.01 -0.12 -0.17 -0.17 -0.26 -0.24 -0.18 -0.14 -0.14 -0.21
-0.0 -0.02 -0.03 0.02 -0.66 -0.2 -0.2 -0.29 -0.36 -0.5 -0.63 -0.61 -0.43 -0.0 -0.02 -0.03 0.02 -0.66 -0.2 -0.2 -0.29 -0.36 -0.5 -0.63 -0.61 -0.43
-0.0 -0.01 -0.02 0.01 0.21 -0.12 -0.12 -0.17 -0.28 -0.53 0.18 0.15 -0.03 -0.0 -0.01 -0.02 0.01 0.21 -0.12 -0.12 -0.17 -0.28 -0.53 0.18 0.15 -0.03
-0.0 -0.0 -0.0 0.0 0.03 -0.02 -0.02 -0.03 -0.02 0.01 -0.52 -0.17 -0.09 -0.0 -0.0 -0.0 0.0 0.03 -0.02 -0.02 -0.03 -0.02 0.01 -0.52 -0.17 -0.09
-0.0 -0.01 -0.01 0.01 0.11 -0.06 -0.06 -0.09 -0.05 0.02 -0.28 -0.59 -0.31 -0.0 -0.01 -0.01 0.01 0.11 -0.06 -0.06 -0.09 -0.05 0.02 -0.28 -0.59 -0.31
-0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -1.0 -0.0 -0.0 -0.0 -0.0 -0.0 0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -1.0 -0.0 -0.0 -0.0 -0.0 -0.0 0.0
0.0 0.01 0.02 -0.01 -0.22 0.37 0.37 -0.45 -0.41 -0.32 -0.24 -0.25 -0.36 0.0 0.01 0.02 -0.01 -0.22 0.37 0.37 -0.45 -0.41 -0.32 -0.24 -0.25 -0.36
0.0 0.01 0.02 -0.01 -0.21 0.12 0.12 0.17 -0.72 -0.47 -0.18 -0.15 0.03 0.0 0.01 0.02 -0.01 -0.21 0.12 0.12 0.17 -0.72 -0.47 -0.18 -0.15 0.03
0.0 0.01 0.01 -0.01 -0.14 0.08 0.08 0.12 0.07 -0.03 -0.2 -0.24 -0.6 0.0 0.01 0.01 -0.01 -0.14 0.08 0.08 0.12 0.07 -0.03 -0.2 -0.24 -0.6
0.0 0.01 0.02 -0.01 -0.21 0.12 0.12 0.17 0.28 -0.47 -0.18 -0.15 0.03 0.0 0.01 0.02 -0.01 -0.21 0.12 0.12 0.17 0.28 -0.47 -0.18 -0.15 0.03
-0.0 -0.0 -0.0 0.0 0.03 -0.02 -0.02 -0.03 -0.02 0.01 0.48 -0.17 -0.09 -0.0 -0.0 -0.0 0.0 0.03 -0.02 -0.02 -0.03 -0.02 0.01 0.48 -0.17 -0.09
-0.0 -0.01 -0.01 0.01 0.14 -0.08 -0.08 -0.12 -0.07 0.03 0.2 0.24 -0.4 -0.0 -0.01 -0.01 0.01 0.14 -0.08 -0.08 -0.12 -0.07 0.03 0.2 0.24 -0.4
] ]
end
end end
@testset "_line_outage_factors" begin @testset "_line_outage_factors" begin
instance = UnitCommitment.read("$FIXTURES/case14.json.gz") instance = UnitCommitment.read("$FIXTURES/case14.json.gz")
for sc in instance.scenarios sc = instance.scenarios[1]
isf_before = UnitCommitment._injection_shift_factors( isf_before = UnitCommitment._injection_shift_factors(
lines = sc.lines, lines = sc.lines,
buses = sc.buses, buses = sc.buses,
) )
lodf = UnitCommitment._line_outage_factors( lodf = UnitCommitment._line_outage_factors(
lines = sc.lines, lines = sc.lines,
buses = sc.buses, buses = sc.buses,
isf = isf_before, isf = isf_before,
) )
for contingency in sc.contingencies for contingency in sc.contingencies
for lc in contingency.lines for lc in contingency.lines
prev_susceptance = lc.susceptance prev_susceptance = lc.susceptance
lc.susceptance = 0.0 lc.susceptance = 0.0
isf_after = UnitCommitment._injection_shift_factors( isf_after = UnitCommitment._injection_shift_factors(
lines = sc.lines, lines = sc.lines,
buses = sc.buses, buses = sc.buses,
) )
lc.susceptance = prev_susceptance lc.susceptance = prev_susceptance
for lm in sc.lines for lm in sc.lines
expected = isf_after[lm.offset, :] expected = isf_after[lm.offset, :]
actual = actual =
isf_before[lm.offset, :] + isf_before[lm.offset, :] +
lodf[lm.offset, lc.offset] * isf_before[lc.offset, :] lodf[lm.offset, lc.offset] * isf_before[lc.offset, :]
@test norm(expected - actual) < 1e-6 @test norm(expected - actual) < 1e-6
end
end end
end end
end end

@ -8,21 +8,20 @@ using UnitCommitment, Cbc, JuMP
# Load instance # Load instance
instance = UnitCommitment.read("$FIXTURES/case118-initcond.json.gz") instance = UnitCommitment.read("$FIXTURES/case118-initcond.json.gz")
optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0) optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0)
for sc in instance.scenarios sc = instance.scenarios[1]
# All units should have unknown initial conditions # All units should have unknown initial conditions
for g in sc.units for g in sc.units
@test g.initial_power === nothing @test g.initial_power === nothing
@test g.initial_status === nothing @test g.initial_status === nothing
end end
# Generate initial conditions # Generate initial conditions
UnitCommitment.generate_initial_conditions!(sc, optimizer) UnitCommitment.generate_initial_conditions!(sc, optimizer)
# All units should now have known initial conditions # All units should now have known initial conditions
for g in sc.units for g in sc.units
@test g.initial_power !== nothing @test g.initial_power !== nothing
@test g.initial_status !== nothing @test g.initial_status !== nothing
end
end end
# TODO: Check that initial conditions are feasible # TODO: Check that initial conditions are feasible

@ -9,77 +9,57 @@ using Distributions
using Random using Random
using UnitCommitment, Cbc, JuMP using UnitCommitment, Cbc, JuMP
get_instance() = UnitCommitment.read_benchmark("matpower/case118/2017-02-01") 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) system_load(sc) = sum(b.load for b in sc.buses)
test_approx(x, y) = @test isapprox(x, y, atol = 1e-3) test_approx(x, y) = @test isapprox(x, y, atol = 1e-3)
@testset "XavQiuAhm2021" begin @testset "XavQiuAhm2021" begin
@testset "cost and load share" begin @testset "cost and load share" begin
instance = get_instance() sc = get_scenario()
for sc in instance.scenarios # Check original costs
# Check original costs unit = sc.units[10]
unit = sc.units[10] test_approx(unit.min_power_cost[1], 825.023)
test_approx(unit.min_power_cost[1], 825.023) test_approx(unit.cost_segments[1].cost[1], 36.659)
test_approx(unit.cost_segments[1].cost[1], 36.659) test_approx(unit.startup_categories[1].cost[1], 7570.42)
test_approx(unit.startup_categories[1].cost[1], 7570.42)
# Check original load share # Check original load share
bus = sc.buses[1] bus = sc.buses[1]
prev_system_load = system_load(sc) prev_system_load = system_load(sc)
test_approx(bus.load[1] / prev_system_load[1], 0.012) test_approx(bus.load[1] / prev_system_load[1], 0.012)
randomize!( randomize!(
sc, sc,
XavQiuAhm2021.Randomization(randomize_load_profile = false), XavQiuAhm2021.Randomization(randomize_load_profile = false),
rng = MersenneTwister(42), rng = MersenneTwister(42),
) )
# Check randomized costs # Check randomized costs
test_approx(unit.min_power_cost[1], 831.977) test_approx(unit.min_power_cost[1], 831.977)
test_approx(unit.cost_segments[1].cost[1], 36.968) test_approx(unit.cost_segments[1].cost[1], 36.968)
test_approx(unit.startup_categories[1].cost[1], 7634.226) test_approx(unit.startup_categories[1].cost[1], 7634.226)
# Check randomized load share # Check randomized load share
curr_system_load = system_load(sc) curr_system_load = system_load(sc)
test_approx(bus.load[1] / curr_system_load[1], 0.013) test_approx(bus.load[1] / curr_system_load[1], 0.013)
# System load should not change # System load should not change
@test prev_system_load curr_system_load @test prev_system_load curr_system_load
end
end end
@testset "load profile" begin @testset "load profile" begin
instance = get_instance() sc = get_scenario()
for sc in instance.scenarios # Check original load profile
# Check original load profile @test round.(system_load(sc), digits = 1)[1:8]
@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]
3059.5,
2983.2,
2937.5,
2953.9,
3073.1,
3356.4,
4068.5,
4018.8,
]
randomize!( randomize!(sc, XavQiuAhm2021.Randomization(); rng = MersenneTwister(42))
sc,
XavQiuAhm2021.Randomization();
rng = MersenneTwister(42),
)
# Check randomized load profile # Check randomized load profile
@test round.(system_load(sc), digits = 1)[1:8] [ @test round.(system_load(sc), digits = 1)[1:8]
4854.7, [4854.7, 4849.2, 4732.7, 4848.2, 4948.4, 5231.1, 5874.8, 5934.8]
4849.2,
4732.7,
4848.2,
4948.4,
5231.1,
5874.8,
5934.8,
]
end
end end
end end

@ -7,35 +7,35 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip
@testset "slice" begin @testset "slice" begin
instance = UnitCommitment.read("$FIXTURES/case14.json.gz") instance = UnitCommitment.read("$FIXTURES/case14.json.gz")
modified = UnitCommitment.slice(instance, 1:2) modified = UnitCommitment.slice(instance, 1:2)
sc = modified.scenarios[1]
# Should update all time-dependent fields # Should update all time-dependent fields
@test modified.time == 2 @test modified.time == 2
for sc in modified.scenarios @test length(sc.power_balance_penalty) == 2
@test length(sc.power_balance_penalty) == 2 @test length(sc.reserves_by_name["r1"].amount) == 2
@test length(sc.reserves_by_name["r1"].amount) == 2 for u in sc.units
for u in sc.units @test length(u.max_power) == 2
@test length(u.max_power) == 2 @test length(u.min_power) == 2
@test length(u.min_power) == 2 @test length(u.must_run) == 2
@test length(u.must_run) == 2 @test length(u.min_power_cost) == 2
@test length(u.min_power_cost) == 2 for s in u.cost_segments
for s in u.cost_segments @test length(s.mw) == 2
@test length(s.mw) == 2 @test length(s.cost) == 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 end
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 # Should be able to build model without errors
optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0) optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0)
model = UnitCommitment.build_model( model = UnitCommitment.build_model(

@ -7,9 +7,7 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON
@testset "usage" begin @testset "usage" begin
instance = UnitCommitment.read("$FIXTURES/case14.json.gz") instance = UnitCommitment.read("$FIXTURES/case14.json.gz")
for sc in instance.scenarios for sc in instance.scenarios
sc.power_balance_penalty = [100000 for _ in 1:instance.time] sc.power_balance_penalty = [100_000 for _ in 1:instance.time]
end
for sc in instance.scenarios
for line in sc.lines, t in 1:4 for line in sc.lines, t in 1:4
line.normal_flow_limit[t] = 10.0 line.normal_flow_limit[t] = 10.0
end end

@ -17,8 +17,6 @@ end
json["Generators"]["g1"]["Production cost curve (MW)"] = [100, 150, 200] json["Generators"]["g1"]["Production cost curve (MW)"] = [100, 150, 200]
json["Generators"]["g1"]["Production cost curve (\$)"] = [10, 25, 30] json["Generators"]["g1"]["Production cost curve (\$)"] = [10, 25, 30]
sc = UnitCommitment._from_json(json, repair = false) sc = UnitCommitment._from_json(json, repair = false)
sc.name = "s1"
sc.probability = 1.0
@test UnitCommitment.repair!(sc) == 4 @test UnitCommitment.repair!(sc) == 4
end end

Loading…
Cancel
Save