From 48094ded6b9c397fe41adc828d2841d9ee13cad4 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 27 Nov 2025 08:55:27 -0600 Subject: [PATCH] KnuOstWat2018: Fix eq_segprod_limit when min_uptime=1 --- .../formulations/KnuOstWat2018/pwlcosts.jl | 8 +++----- test/fixtures/issue-0057.json.gz | Bin 0 -> 457 bytes test/src/UnitCommitmentT.jl | 2 ++ test/src/regression.jl | 19 ++++++++++++++++++ 4 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/issue-0057.json.gz create mode 100644 test/src/regression.jl diff --git a/src/model/formulations/KnuOstWat2018/pwlcosts.jl b/src/model/formulations/KnuOstWat2018/pwlcosts.jl index e34db21..a70773b 100644 --- a/src/model/formulations/KnuOstWat2018/pwlcosts.jl +++ b/src/model/formulations/KnuOstWat2018/pwlcosts.jl @@ -67,21 +67,19 @@ function _add_production_piecewise_linear_eqs!( (t < T ? Cw * switch_off[gn, t+1] : 0.0) ) else - # Equation (47a)/(48a) in Kneuven et al. (2020) + # Equation (47a) in Kneuven et al. (2020) eq_segprod_limit_b[sc.name, gn, t, k] = @constraint( model, segprod[sc.name, gn, t, k] <= g.cost_segments[k].mw[t] * is_on[gn, t] - - Cv * switch_on[gn, t] - - (t < T ? max(0, Cv - Cw) * switch_off[gn, t+1] : 0.0) + Cv * switch_on[gn, t] ) - # Equation (47b)/(48b) in Kneuven et al. (2020) + # Equation (47b) in Kneuven et al. (2020) eq_segprod_limit_c[sc.name, gn, t, k] = @constraint( model, segprod[sc.name, gn, t, k] <= g.cost_segments[k].mw[t] * is_on[gn, t] - - max(0, Cw - Cv) * switch_on[gn, t] - (t < T ? Cw * switch_off[gn, t+1] : 0.0) ) end diff --git a/test/fixtures/issue-0057.json.gz b/test/fixtures/issue-0057.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..26cb3cf15746945a641f5c16fb482cfffb21b8d6 GIT binary patch literal 457 zcmV;)0XF_0iwFo&WhiL?18H+}b!9CuFf}(WYIARH0F{$XO9L?whVT6qVewF*)@HwI zJ?cROg`%PdDU$9E-M}VUva^;d{qH7etKGEK8giO>nD?DY=Cec03C2t_0SLMdF3G2h zx%jh*a3xJJ81$o{_mg?z0!WQek*?tK)DY=lD?L_o&}7O=CNm%vNLJ#4bWhIjUo1<* zB#O51$IK9#DOCUU*i=reKBz;ZDDDr#VVoRQEQgXU z>h*)|as6wN2PP_Fij-V%+zfX#8tub!HJ5*Z8&hp;;8R6|$5gxLl8Z(-WwgI@{VNY( zO|=D4zXhnlzAlt}#;3gGxUlo`2XZSpa#oVcE#BIh?|%c;$gtUr{>-;^t%T`LfW$Ru z^=Qvjb9eGhFI!t?_658JGrP01R(Fc!hqqy8mj4d6zm4y;v+R5UuMni`^8^3@BTC;K literal 0 HcmV?d00001 diff --git a/test/src/UnitCommitmentT.jl b/test/src/UnitCommitmentT.jl index 473e858..1b7a011 100644 --- a/test/src/UnitCommitmentT.jl +++ b/test/src/UnitCommitmentT.jl @@ -23,6 +23,7 @@ include("validation/repair_test.jl") include("lmp/conventional_test.jl") include("lmp/aelmp_test.jl") include("market/market_test.jl") +include("regression.jl") basedir = dirname(@__FILE__) @@ -54,6 +55,7 @@ function runtests() lmp_aelmp_test() simple_market_test() stochastic_market_test() + regression_test() end return end diff --git a/test/src/regression.jl b/test/src/regression.jl new file mode 100644 index 0000000..308c36c --- /dev/null +++ b/test/src/regression.jl @@ -0,0 +1,19 @@ +# 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, HiGHS, JuMP + +function regression_test() + @testset "GitHub Issue #57" begin + instance = UnitCommitment.read(fixture("issue-0057.json.gz")) + model = UnitCommitment.build_model( + instance = instance, + optimizer = HiGHS.Optimizer, + ) + JuMP.set_silent(model) + UnitCommitment.optimize!(model) + solution = UnitCommitment.solution(model) + @test solution["Thermal production (MW)"]["gen_524d4c85"][1] == 90.0 + end +end