From 7308ff6477f7f2d03ad01eaca5df25b858056550 Mon Sep 17 00:00:00 2001 From: Alinson S Xavier Date: Tue, 3 Aug 2021 12:51:37 -0500 Subject: [PATCH] Revert unrelated changes --- src/model/formulations/Gar1962/status.jl | 98 ++--------------------- src/model/formulations/Gar1962/structs.jl | 47 +---------- src/model/formulations/base/unit.jl | 20 +---- 3 files changed, 10 insertions(+), 155 deletions(-) diff --git a/src/model/formulations/Gar1962/status.jl b/src/model/formulations/Gar1962/status.jl index 4678bb0..14c055f 100644 --- a/src/model/formulations/Gar1962/status.jl +++ b/src/model/formulations/Gar1962/status.jl @@ -2,12 +2,6 @@ # Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved. # Released under the modified BSD license. See COPYING.md for more details. -""" - _add_status_vars! - -Adds symbols identified by `Gar1962.StatusVars` to `model`. -Fix variables if a certain generator _must_ run or based on initial conditions. -""" function _add_status_vars!( model::JuMP.Model, g::Unit, @@ -16,93 +10,15 @@ function _add_status_vars!( is_on = _init(model, :is_on) switch_on = _init(model, :switch_on) switch_off = _init(model, :switch_off) - FIX_VARS = !formulation_status_vars.fix_vars_via_constraint - is_initially_on = _is_initially_on(g) > 0 for t in 1:model[:instance].time - is_on[g.name, t] = @variable(model, binary = true) - switch_on[g.name, t] = @variable(model, binary = true) - switch_off[g.name, t] = @variable(model, binary = true) - - # Use initial conditions and whether a unit must run to fix variables - if FIX_VARS - # Fix variables using fix function - if g.must_run[t] - # If the generator _must_ run, then it is obviously on and cannot be switched off - # In the first time period, force unit to switch on if was off before - # Otherwise, unit is on, and will never turn off, so will never need to turn on - fix(is_on[g.name, t], 1.0; force = true) - fix( - switch_on[g.name, t], - (t == 1 ? 1.0 - _is_initially_on(g) : 0.0); - force = true, - ) - fix(switch_off[g.name, t], 0.0; force = true) - elseif t == 1 - if is_initially_on - # Generator was on (for g.initial_status time periods), - # so cannot be more switched on until the period after the first time it can be turned off - fix(switch_on[g.name, 1], 0.0; force = true) - else - # Generator is initially off (for -g.initial_status time periods) - # Cannot be switched off more - fix(switch_off[g.name, 1], 0.0; force = true) - end - end + if g.must_run[t] + is_on[g.name, t] = 1.0 + switch_on[g.name, t] = (t == 1 ? 1.0 - _is_initially_on(g) : 0.0) + switch_off[g.name, t] = 0.0 else - # Add explicit constraint if !FIX_VARS - if g.must_run[t] - is_on[g.name, t] = 1.0 - switch_on[g.name, t] = - (t == 1 ? 1.0 - _is_initially_on(g) : 0.0) - switch_off[g.name, t] = 0.0 - elseif t == 1 - if is_initially_on - switch_on[g.name, t] = 0.0 - else - switch_off[g.name, t] = 0.0 - end - end - end - - # Use initial conditions and whether a unit must run to fix variables - if FIX_VARS - # Fix variables using fix function - if g.must_run[t] - # If the generator _must_ run, then it is obviously on and cannot be switched off - # In the first time period, force unit to switch on if was off before - # Otherwise, unit is on, and will never turn off, so will never need to turn on - fix(is_on[g.name, t], 1.0; force = true) - fix( - switch_on[g.name, t], - (t == 1 ? 1.0 - _is_initially_on(g) : 0.0); - force = true, - ) - fix(switch_off[g.name, t], 0.0; force = true) - elseif t == 1 - if is_initially_on - # Generator was on (for g.initial_status time periods), - # so cannot be more switched on until the period after the first time it can be turned off - fix(switch_on[g.name, 1], 0.0; force = true) - else - # Generator is initially off (for -g.initial_status time periods) - # Cannot be switched off more - fix(switch_off[g.name, 1], 0.0; force = true) - end - end - else - # Add explicit constraint if !FIX_VARS - if g.must_run[t] - is_on[g.name, t] = 1.0 - switch_on[g.name, t] = - (t == 1 ? 1.0 - _is_initially_on(g) : 0.0) - switch_off[g.name, t] = 0.0 - elseif t == 1 - if is_initially_on - switch_on[g.name, t] = 0.0 - else - switch_off[g.name, t] = 0.0 - end - end + is_on[g.name, t] = @variable(model, binary = true) + switch_on[g.name, t] = @variable(model, binary = true) + switch_off[g.name, t] = @variable(model, binary = true) end end return diff --git a/src/model/formulations/Gar1962/structs.jl b/src/model/formulations/Gar1962/structs.jl index 8cc0c31..db847ee 100644 --- a/src/model/formulations/Gar1962/structs.jl +++ b/src/model/formulations/Gar1962/structs.jl @@ -17,53 +17,8 @@ import ..PiecewiseLinearCostsFormulation import ..ProductionVarsFormulation import ..StatusVarsFormulation -""" -Variables ---- -* `prod_above`: - [gen, t]; - *production above minimum required level*; - lb: 0, ub: Inf. - KnuOstWat2020: `p'_g(t)` -* `segprod`: - [gen, segment, t]; - *how much generator produces on cost segment in time t*; - lb: 0, ub: Inf. - KnuOstWat2020: `p_g^l(t)` -""" struct ProdVars <: ProductionVarsFormulation end - struct PwlCosts <: PiecewiseLinearCostsFormulation end - -""" -Variables ---- -* `is_on`: - [gen, t]; - *is generator on at time t?* - lb: 0, ub: 1, binary. - KnuOstWat2020: `u_g(t)` -* `switch_on`: - [gen, t]; - *indicator that generator will be turned on at t*; - lb: 0, ub: 1, binary. - KnuOstWat2020: `v_g(t)` -* `switch_off`: binary; - [gen, t]; - *indicator that generator will be turned off at t*; - lb: 0, ub: 1, binary. - KnuOstWat2020: `w_g(t)` - -Arguments ---- -* `fix_vars_via_constraint`: - indicator for whether to set vars to a constant using `fix` or by adding an explicit constraint - (particulary useful for debugging purposes). -""" -struct StatusVars <: StatusVarsFormulation - fix_vars_via_constraint::Bool - - StatusVars() = new(false) -end +struct StatusVars <: StatusVarsFormulation end end diff --git a/src/model/formulations/base/unit.jl b/src/model/formulations/base/unit.jl index 0220678..010a275 100644 --- a/src/model/formulations/base/unit.jl +++ b/src/model/formulations/base/unit.jl @@ -2,15 +2,6 @@ # Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved. # Released under the modified BSD license. See COPYING.md for more details. -""" - _add_unit!(model::JuMP.Model, g::Unit, formulation::Formulation) - -Add production, reserve, startup, shutdown, and status variables, -and constraints for min uptime/downtime, net injection, production, ramping, startup, shutdown, and status. - -Fix variables if a certain generator _must_ run or if a generator provides spinning reserves. -Also, add overflow penalty to objective for each transmission line. -""" function _add_unit!(model::JuMP.Model, g::Unit, formulation::Formulation) if !all(g.must_run) && any(g.must_run) error("Partially must-run units are not currently supported") @@ -124,15 +115,8 @@ function _add_startup_shutdown_limit_eqs!( ) # Shutdown limit if g.initial_power > g.shutdown_limit - # TODO check what happens with these variables when exporting the model - # Generator producing too much to be turned off in the first time period - # (can a binary variable have bounds x = 0?) - if formulation_status_vars.fix_vars_via_constraint - eq_shutdown_limit[g.name, 0] = - @constraint(model, model[:switch_off][g.name, 1] <= 0.0) - else - fix(model[:switch_off][g.name, 1], 0.0; force = true) - end + eq_shutdown_limit[g.name, 0] = + @constraint(model, switch_off[g.name, 1] <= 0) end if t < T eq_shutdown_limit[g.name, t] = @constraint(