From cb7f9e3b27d2c90ab5194285d81d5196e7219c28 Mon Sep 17 00:00:00 2001 From: Jun He Date: Thu, 6 Apr 2023 16:16:04 -0400 Subject: [PATCH] Added minimum power to profiled generator --- src/instance/read.jl | 1 + src/instance/structs.jl | 1 + src/model/formulations/base/punit.jl | 2 +- test/fixtures/case14-profiled.json.gz | Bin 1921 -> 1931 bytes test/instance/read_test.jl | 2 ++ 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/instance/read.jl b/src/instance/read.jl index b095b0a..1fda33b 100644 --- a/src/instance/read.jl +++ b/src/instance/read.jl @@ -314,6 +314,7 @@ function _from_json(json; repair = true)::UnitCommitmentScenario pu = ProfiledUnit( unit_name, bus, + timeseries(scalar(dict["Minimum power (MW)"], default = 0.0)), timeseries(dict["Maximum power (MW)"]), timeseries(dict["Cost (\$/MW)"]), ) diff --git a/src/instance/structs.jl b/src/instance/structs.jl index 9d6cc5c..bdf729f 100644 --- a/src/instance/structs.jl +++ b/src/instance/structs.jl @@ -77,6 +77,7 @@ end mutable struct ProfiledUnit name::String bus::Bus + min_power::Vector{Float64} capacity::Vector{Float64} cost::Vector{Float64} end diff --git a/src/model/formulations/base/punit.jl b/src/model/formulations/base/punit.jl index ced3ba9..c6ac864 100644 --- a/src/model/formulations/base/punit.jl +++ b/src/model/formulations/base/punit.jl @@ -12,7 +12,7 @@ function _add_profiled_unit!( for t in 1:model[:instance].time # Decision variable punits[sc.name, pu.name, t] = - @variable(model, lower_bound = 0, upper_bound = pu.capacity[t]) + @variable(model, lower_bound = pu.min_power[t], upper_bound = pu.capacity[t]) # Objective function terms add_to_expression!( diff --git a/test/fixtures/case14-profiled.json.gz b/test/fixtures/case14-profiled.json.gz index c98d7d5e85add5d38e5aeeee8a922beff2643dff..f0c6b87be0a9572a65baa42337ec85ae6dd5eb0b 100644 GIT binary patch literal 1931 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 Hf-wL9B*&aE diff --git a/test/instance/read_test.jl b/test/instance/read_test.jl index b7e27f0..78c3d78 100644 --- a/test/instance/read_test.jl +++ b/test/instance/read_test.jl @@ -141,6 +141,7 @@ end @test first_pu.name == "g7" @test first_pu.bus.name == "b4" @test first_pu.cost == [100.0 for t in 1:4] + @test first_pu.min_power == [60.0 for t in 1:4] @test first_pu.capacity == [100.0 for t in 1:4] @test sc.profiled_units_by_name["g7"].name == "g7" @@ -148,6 +149,7 @@ end @test second_pu.name == "g8" @test second_pu.bus.name == "b5" @test second_pu.cost == [50.0 for t in 1:4] + @test second_pu.min_power == [0.0 for t in 1:4] @test second_pu.capacity == [120.0 for t in 1:4] @test sc.profiled_units_by_name["g8"].name == "g8" end