From 3282e5bc3a3382df8d008057aaedf17fbe1e6668 Mon Sep 17 00:00:00 2001 From: Alinson S Xavier Date: Mon, 20 Jun 2022 14:14:37 -0500 Subject: [PATCH] Fix all tests --- Project.toml | 1 + src/model/formulations/base/unit.jl | 2 +- src/solution/fix.jl | 18 +++++++++++++++--- src/transform/slice.jl | 5 +++-- src/validation/validate.jl | 23 +++++++++++++---------- test/fixtures/case118-initcond.json.gz | Bin 24217 -> 24064 bytes test/instance/read_test.jl | 12 ++++-------- test/transform/slice_test.jl | 3 +-- 8 files changed, 38 insertions(+), 26 deletions(-) diff --git a/Project.toml b/Project.toml index 6570a70..ce2d6a6 100644 --- a/Project.toml +++ b/Project.toml @@ -17,6 +17,7 @@ MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" PackageCompiler = "9b87118b-4619-50d2-8e1e-99f35a4d4d9d" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [compat] diff --git a/src/model/formulations/base/unit.jl b/src/model/formulations/base/unit.jl index 1e08a90..1ed6571 100644 --- a/src/model/formulations/base/unit.jl +++ b/src/model/formulations/base/unit.jl @@ -212,7 +212,7 @@ end function _total_reserves(model, g)::Vector T = model[:instance].time - reserve = 0.0 + reserve = [0.0 for _ in 1:T] if !isempty(g.reserves) reserve += [ sum(model[:reserve][r.name, g.name, t] for r in g.reserves) for diff --git a/src/solution/fix.jl b/src/solution/fix.jl index f9deacb..114e3ce 100644 --- a/src/solution/fix.jl +++ b/src/solution/fix.jl @@ -18,15 +18,27 @@ function fix!(model::JuMP.Model, solution::AbstractDict)::Nothing is_on_value = round(solution["Is on"][g.name][t]) prod_value = round(solution["Production (MW)"][g.name][t], digits = 5) - reserve_value = - round(solution["Reserve (MW)"][g.name][t], digits = 5) JuMP.fix(is_on[g.name, t], is_on_value, force = true) JuMP.fix( prod_above[g.name, t], prod_value - is_on_value * g.min_power[t], force = true, ) - JuMP.fix(reserve[g.name, t], reserve_value, force = true) + end + end + for r in instance.reserves + for g in r.units + for t in 1:T + reserve_value = round( + solution["Reserve (MW)"][r.name][g.name][t], + digits = 5, + ) + JuMP.fix( + reserve[r.name, g.name, t], + reserve_value, + force = true, + ) + end end end return diff --git a/src/transform/slice.jl b/src/transform/slice.jl index 582d47e..336817f 100644 --- a/src/transform/slice.jl +++ b/src/transform/slice.jl @@ -24,13 +24,14 @@ function slice( modified = deepcopy(instance) modified.time = length(range) modified.power_balance_penalty = modified.power_balance_penalty[range] - modified.reserves.spinning = modified.reserves.spinning[range] + for r in modified.reserves + r.amount = r.amount[range] + end for u in modified.units u.max_power = u.max_power[range] u.min_power = u.min_power[range] u.must_run = u.must_run[range] u.min_power_cost = u.min_power_cost[range] - u.provides_spinning_reserves = u.provides_spinning_reserves[range] for s in u.cost_segments s.mw = s.mw[range] s.cost = s.cost[range] diff --git a/src/validation/validate.jl b/src/validation/validate.jl index 5d69bc7..27638b1 100644 --- a/src/validation/validate.jl +++ b/src/validation/validate.jl @@ -40,15 +40,15 @@ function validate( return true end -function _validate_units(instance, solution; tol = 0.01) +function _validate_units(instance::UnitCommitmentInstance, solution; tol = 0.01) err_count = 0 for unit in instance.units production = solution["Production (MW)"][unit.name] - reserve = solution["Reserve (MW)"][unit.name] + reserve = [0.0 for _ in 1:instance.time] if !isempty(unit.reserves) reserve += sum( - solution["Reserve 2 (MW)"][r.name][unit.name] for + solution["Reserve (MW)"][r.name][unit.name] for r in unit.reserves ) end @@ -105,13 +105,16 @@ function _validate_units(instance, solution; tol = 0.01) end # Verify reserve eligibility - if !unit.provides_spinning_reserves[t] && reserve[t] > tol - @error @sprintf( - "Unit %s is not eligible to provide spinning reserves at time %d", - unit.name, - t - ) - err_count += 1 + for r in instance.reserves + if unit ∉ r.units && + (unit in keys(solution["Reserve (MW)"][r.name])) + @error @sprintf( + "Unit %s is not eligible to provide reserve %s", + unit.name, + r.name, + ) + err_count += 1 + end end # If unit is on, must produce at least its minimum power diff --git a/test/fixtures/case118-initcond.json.gz b/test/fixtures/case118-initcond.json.gz index a81a7876a8f2ed9221816de37af106b04d0550cf..fabcbc8f05c9055f83239b4efda7c2f7d639536c 100644 GIT binary patch literal 24064 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 diff --git a/test/instance/read_test.jl b/test/instance/read_test.jl index 6984435..ecf7f81 100644 --- a/test/instance/read_test.jl +++ b/test/instance/read_test.jl @@ -12,7 +12,6 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip @test length(instance.units) == 6 @test length(instance.contingencies) == 19 @test length(instance.price_sensitive_loads) == 1 - @test length(instance.reserves2) == 1 @test instance.time == 4 @test instance.lines[5].name == "l5" @@ -38,9 +37,9 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip @test instance.buses[9].load == [35.36638, 33.25495, 31.67138, 31.14353] @test instance.buses_by_name["b9"].name == "b9" - @test instance.reserves2[1].name == "r1" - @test instance.reserves2[1].type == "spinning" - @test instance.reserves2[1].amount == [100.0, 100.0, 100.0, 100.0] + @test instance.reserves[1].name == "r1" + @test instance.reserves[1].type == "spinning" + @test instance.reserves[1].amount == [100.0, 100.0, 100.0, 100.0] @test instance.reserves_by_name["r1"].name == "r1" unit = instance.units[1] @@ -54,7 +53,6 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip @test unit.min_power_cost == [1400.0 for t in 1:4] @test unit.min_uptime == 1 @test unit.min_downtime == 1 - @test unit.provides_spinning_reserves == [true for t in 1:4] for t in 1:1 @test unit.cost_segments[1].mw[t] == 10.0 @test unit.cost_segments[2].mw[t] == 20.0 @@ -89,7 +87,6 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip @test unit.min_power_cost == [0.0 for t in 1:4] @test unit.min_uptime == 1 @test unit.min_downtime == 1 - @test unit.provides_spinning_reserves == [true for t in 1:4] for t in 1:4 @test unit.cost_segments[1].mw[t] ≈ 33 @test unit.cost_segments[2].mw[t] ≈ 33 @@ -99,8 +96,7 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip @test unit.cost_segments[3].cost[t] ≈ 44.77853 end @test length(unit.reserves) == 1 - - @test instance.reserves.spinning == zeros(4) + @test unit.reserves[1].name == "r1" @test instance.contingencies[1].lines == [instance.lines[1]] @test instance.contingencies[1].units == [] diff --git a/test/transform/slice_test.jl b/test/transform/slice_test.jl index f330bda..84b0f84 100644 --- a/test/transform/slice_test.jl +++ b/test/transform/slice_test.jl @@ -11,13 +11,12 @@ using UnitCommitment, LinearAlgebra, Cbc, JuMP, JSON, GZip # Should update all time-dependent fields @test modified.time == 2 @test length(modified.power_balance_penalty) == 2 - @test length(modified.reserves.spinning) == 2 + @test length(modified.reserves_by_name["r1"].amount) == 2 for u in modified.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 - @test length(u.provides_spinning_reserves) == 2 for s in u.cost_segments @test length(s.mw) == 2 @test length(s.cost) == 2