Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ PowerFlowsExt = "PowerFlows"
[sources]
InfrastructureSystems = {url = "https://github.com/NREL-Sienna/InfrastructureSystems.jl", rev = "IS4"}
PowerSystems = {url = "https://github.com/NREL-Sienna/PowerSystems.jl", rev = "psy6"}
InfrastructureOptimizationModels = {url = "https://github.com/NREL-Sienna/InfrastructureOptimizationModels.jl", rev = "ac/psi-costexp-parambroad-pfslack"}
InfrastructureOptimizationModels = {url = "https://github.com/Sienna-Platform/InfrastructureOptimizationModels.jl", rev = "lk/flow-sign-trait"}

[compat]
Dates = "1"
Expand Down
1 change: 0 additions & 1 deletion src/ac_transmission_models/AC_branches.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ get_parameter_multiplier(::Type{LowerBoundValueParameter}, ::PSY.ACTransmission,
get_parameter_multiplier(::Type{UpperBoundValueParameter}, ::PSY.ACTransmission, ::Type{<:AbstractBranchFormulation}) = 1.0

# Per-device reactance multiplier (1/get_x(d)) computed inline at add_to_expression! call sites.
get_variable_multiplier(::Type{PhaseShifterAngle}, ::Type{<:PSY.PhaseShiftingTransformer}, ::Type{PhaseAngleControl}) = 1.0

get_multiplier_value(::Type{<:AbstractDynamicBranchRatingTimeSeriesParameter}, d::PSY.ACTransmission, ::Type{StaticBranch}) = PSY.get_rating(d)
get_multiplier_value(::Type{<:AbstractDynamicBranchRatingTimeSeriesParameter}, d::PNM.BranchesParallel, ::Type{StaticBranch}) = PNM.get_equivalent_rating(d)
Expand Down
30 changes: 23 additions & 7 deletions src/core/interfaces.jl
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,29 @@ end

"""
Get the multiplier for a variable type when adding to an expression.
Default implementation returns 1.0.
"""
get_variable_multiplier(
::Type{<:IS.Optimization.VariableType},
::Type{<:IS.InfrastructureSystemsComponent},
::Type{<:IOM.AbstractDeviceFormulation},
) = 1.0

Default consults [`IOM.flow_sign`](@ref) on the variable type: variables marked
`FlowInjection` contribute `+1.0`, `FlowWithdrawal` contributes `-1.0`, and
`FlowUndirected` falls back to `1.0`. Device-driven sign rules (e.g. anything on `PSY.ElectricLoad`)
should be expressed as more-specific dispatches that override this default.
"""
function get_variable_multiplier(
::Type{V},
# second arg is any system component, or `PSY.System` which is a ComponentContainer
::Type{<:Union{IS.InfrastructureSystemsComponent, IS.ComponentContainer}},
::Type, # could be PowerModel (network) or DeviceFormulation (device)
) where {V <: IS.Optimization.VariableType}
return IOM.multiplier_from_sign(IOM.flow_sign(V))
end

# Hard-error fallback for variable/device/formulation triples that intentionally
# have no defined multiplier (must be specialized at the call site). Used by
# devices like Storage/AGC/Reserve/TwoTerminalHVDC to fail loudly instead of
# returning NaN, which silently poisons JuMP expressions.
@noinline _unsupported_multiplier(V, D, F) = error(
"get_variable_multiplier not implemented for variable $V on $D under $F. " *
"This combination must be specialized.",
)
Comment on lines 84 to +108

"""
Get the multiplier for an expression type based on parameter type.
Expand Down
8 changes: 8 additions & 0 deletions src/core/variables.jl
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,9 @@ Docs abbreviation: ``p^\\text{sl,dn}``
"""
struct SystemBalanceSlackDown <: VariableType end

IOM.flow_sign(::Type{SystemBalanceSlackUp}) = IOM.FlowInjection
IOM.flow_sign(::Type{SystemBalanceSlackDown}) = IOM.FlowWithdrawal

"""
Struct to dispatch the creation of Reserve requirement slack variables. Used when there is not reserves in the system to satisfy the requirement.

Expand Down Expand Up @@ -476,6 +479,9 @@ Docs abbreviation: ``f^\\text{sl,dn}``
"""
struct InterfaceFlowSlackDown <: VariableType end

IOM.flow_sign(::Type{InterfaceFlowSlackUp}) = IOM.FlowInjection
IOM.flow_sign(::Type{InterfaceFlowSlackDown}) = IOM.FlowWithdrawal

"""
Struct to dispatch the creation of Slack variables for UpperBoundFeedforward

Expand Down Expand Up @@ -562,6 +568,8 @@ Struct to dispatch the creation of a variable for pumped power in a hydro pump t
"""
struct ActivePowerPumpVariable <: VariableType end

IOM.flow_sign(::Type{ActivePowerPumpVariable}) = IOM.FlowWithdrawal

"""
Auxiliary Variable for Hydro Models that solve for total energy output

Expand Down
38 changes: 19 additions & 19 deletions src/energy_storage_models/storage_models.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#! format: off
requires_initialization(::AbstractStorageFormulation) = false

get_variable_multiplier(::Type{<:VariableType}, ::Type{<:PSY.Storage}, ::Type{<:AbstractStorageFormulation}) = NaN
get_variable_multiplier(::Type{V}, ::Type{D}, ::Type{F}) where {V <: VariableType, D <: PSY.Storage, F <: AbstractStorageFormulation} = _unsupported_multiplier(V, D, F)
########################### ActivePowerInVariable, Storage #################################
get_variable_binary(::Type{ActivePowerInVariable}, ::Type{<:PSY.Storage}, ::Type{<:AbstractStorageFormulation}) = false
get_variable_lower_bound(::Type{ActivePowerInVariable}, d::PSY.Storage, ::Type{<:AbstractStorageFormulation}) = 0.0
Expand Down Expand Up @@ -431,63 +431,63 @@ function add_variables!(
end

############################# Expression Logic for Ancillary Services ######################
get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableCharge},
::Type{ReserveAssignmentBalanceDownCharge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveUp},
) = 0.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableCharge},
::Type{ReserveAssignmentBalanceDownCharge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveDown},
) = 1.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableCharge},
::Type{ReserveAssignmentBalanceUpCharge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveUp},
) = 1.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableCharge},
::Type{ReserveAssignmentBalanceUpCharge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveDown},
) = 0.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableDischarge},
::Type{ReserveAssignmentBalanceDownDischarge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveUp},
) = 0.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableDischarge},
::Type{ReserveAssignmentBalanceDownDischarge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveDown},
) = 1.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableDischarge},
::Type{ReserveAssignmentBalanceUpDischarge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveUp},
) = 1.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableDischarge},
::Type{ReserveAssignmentBalanceUpDischarge},
d::PSY.Storage,
Expand All @@ -496,63 +496,63 @@ get_variable_multiplier(
) = 0.0

### Deployment ###
get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableCharge},
::Type{ReserveDeploymentBalanceDownCharge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveUp},
) = 0.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableCharge},
::Type{ReserveDeploymentBalanceDownCharge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveDown},
) = 1.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableCharge},
::Type{ReserveDeploymentBalanceUpCharge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveUp},
) = 1.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableCharge},
::Type{ReserveDeploymentBalanceUpCharge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveDown},
) = 0.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableDischarge},
::Type{ReserveDeploymentBalanceDownDischarge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveUp},
) = 0.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableDischarge},
::Type{ReserveDeploymentBalanceDownDischarge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveDown},
) = 1.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableDischarge},
::Type{ReserveDeploymentBalanceUpDischarge},
d::PSY.Storage,
::Type{StorageDispatchWithReserves},
::PSY.Reserve{PSY.ReserveUp},
) = 1.0

get_variable_multiplier(
get_reserve_balance_factor(
::Type{AncillaryServiceVariableDischarge},
::Type{ReserveDeploymentBalanceUpDischarge},
d::PSY.Storage,
Expand Down Expand Up @@ -631,7 +631,7 @@ function add_to_expression!(
for s in services
s_name = PSY.get_name(s)
variable = get_variable(container, U, V, "$(typeof(s))_$s_name")
mult = get_variable_multiplier(U, T, d, W, s) * get_fraction(T, s)
mult = get_reserve_balance_factor(U, T, d, W, s) * get_fraction(T, s)
for t in get_time_steps(container)
add_proportional_to_jump_expression!(
expression[name, t],
Expand Down Expand Up @@ -663,7 +663,7 @@ function add_to_expression!(
for s in services
s_name = PSY.get_name(s)
variable = get_variable(container, U, V, "$(typeof(s))_$s_name")
mult = get_variable_multiplier(U, T, d, W, s) * get_fraction(T, s)
mult = get_reserve_balance_factor(U, T, d, W, s) * get_fraction(T, s)
for t in get_time_steps(container)
add_proportional_to_jump_expression!(
expression[name, t],
Expand Down
2 changes: 0 additions & 2 deletions src/mt_hvdc_models/HVDCsystems.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ get_variable_binary(::Type{ActivePowerVariable}, ::Type{PSY.InterconnectingConve
get_variable_warm_start_value(::Type{ActivePowerVariable}, d::PSY.InterconnectingConverter, ::Type{<:AbstractConverterFormulation}) = PSY.get_active_power(d)
get_variable_lower_bound(::Type{ActivePowerVariable}, d::PSY.InterconnectingConverter, ::Type{<:AbstractConverterFormulation}) = PSY.get_active_power_limits(d).min
get_variable_upper_bound(::Type{ActivePowerVariable}, d::PSY.InterconnectingConverter, ::Type{<:AbstractConverterFormulation}) = PSY.get_active_power_limits(d).max
get_variable_multiplier(::Type{<:VariableType}, ::Type{PSY.InterconnectingConverter}, ::Type{<:AbstractConverterFormulation}) = 1.0


function _get_flow_bounds(d::PSY.TModelHVDCLine)
Expand Down Expand Up @@ -65,7 +64,6 @@ function get_variable_upper_bound(::Type{DCLineCurrent}, d::PSY.TModelHVDCLine,
max_v = max(PSY.get_magnitude(bus_from), PSY.get_magnitude(bus_to))
return p_max_flow / max_v
end
get_variable_multiplier(::Type{<:VariableType}, ::Type{PSY.TModelHVDCLine}, ::Type{<:AbstractBranchFormulation}) = 1.0

requires_initialization(::AbstractConverterFormulation) = false
requires_initialization(::LosslessLine) = false
Expand Down
7 changes: 0 additions & 7 deletions src/network_models/network_slack_variables.jl
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
#! format: off
get_variable_multiplier(::Type{SystemBalanceSlackUp}, ::Type{<: Union{PSY.ACBus, PSY.Area, PSY.System}}, ::Type{<:AbstractDeviceFormulation}) = 1.0
get_variable_multiplier(::Type{SystemBalanceSlackDown}, ::Type{<: Union{PSY.ACBus, PSY.Area, PSY.System}}, ::Type{<:AbstractDeviceFormulation}) = -1.0
get_variable_multiplier(::Type{SystemBalanceSlackUp}, ::Type{<: Union{PSY.ACBus, PSY.Area, PSY.System}}, ::Type{<:AbstractPowerModel}) = 1.0
get_variable_multiplier(::Type{SystemBalanceSlackDown}, ::Type{<: Union{PSY.ACBus, PSY.Area, PSY.System}}, ::Type{<:AbstractPowerModel}) = -1.0
#! format: on

function add_variables!(
container::OptimizationContainer,
::Type{T},
Expand Down
2 changes: 1 addition & 1 deletion src/services_models/agc.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#! format: off
get_variable_multiplier(::Type{<:VariableType}, ::Type{<:PSY.AGC}, ::Type{<:AbstractAGCFormulation}) = NaN
get_variable_multiplier(::Type{V}, ::Type{D}, ::Type{F}) where {V <: VariableType, D <: PSY.AGC, F <: AbstractAGCFormulation} = _unsupported_multiplier(V, D, F)
########################## ActivePowerVariable, AGC ###########################

########################## SteadyStateFrequencyDeviation ##################################
Expand Down
2 changes: 1 addition & 1 deletion src/services_models/reserves.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#! format: off
############################### Reserve Variables #########################################

get_variable_multiplier(::Type{<:VariableType}, ::Type{<:PSY.Reserve}, ::Type{<:AbstractReservesFormulation}) = NaN
get_variable_multiplier(::Type{V}, ::Type{D}, ::Type{F}) where {V <: VariableType, D <: PSY.Reserve, F <: AbstractReservesFormulation} = _unsupported_multiplier(V, D, F)
############################### PostContingencyActivePowerReserveDeploymentVariable, Reserve #########################################
get_variable_binary(::Type{PostContingencyActivePowerReserveDeploymentVariable}, ::Type{<:PSY.Reserve}, ::Type{<:AbstractSecurityConstrainedReservesFormulation}) = false
function get_variable_upper_bound(::Type{PostContingencyActivePowerReserveDeploymentVariable}, r::PSY.Reserve, d::PSY.Device, ::Type{<:AbstractSecurityConstrainedReservesFormulation})
Expand Down
6 changes: 0 additions & 6 deletions src/services_models/transmission_interface.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,6 @@ get_variable_binary(::Type{<:VariableType}, ::Type{PSY.TransmissionInterface}, :
get_variable_lower_bound(::Type{InterfaceFlowSlackUp}, ::PSY.TransmissionInterface, ::Type{ConstantMaxInterfaceFlow}) = 0.0
get_variable_lower_bound(::Type{InterfaceFlowSlackDown}, ::PSY.TransmissionInterface, ::Type{ConstantMaxInterfaceFlow}) = 0.0

get_variable_multiplier(::Type{InterfaceFlowSlackUp}, ::Type{PSY.TransmissionInterface}, ::Type{ConstantMaxInterfaceFlow}) = 1.0
get_variable_multiplier(::Type{InterfaceFlowSlackDown}, ::Type{PSY.TransmissionInterface}, ::Type{ConstantMaxInterfaceFlow}) = -1.0

get_variable_multiplier(::Type{InterfaceFlowSlackUp}, ::Type{PSY.TransmissionInterface}, ::Type{VariableMaxInterfaceFlow}) = 1.0
get_variable_multiplier(::Type{InterfaceFlowSlackDown}, ::Type{PSY.TransmissionInterface}, ::Type{VariableMaxInterfaceFlow}) = -1.0

get_multiplier_value(::Type{MinInterfaceFlowLimitParameter}, d::PSY.TransmissionInterface, ::Type{VariableMaxInterfaceFlow}) = PSY.get_min_active_power_flow_limit(d)
get_multiplier_value(::Type{MaxInterfaceFlowLimitParameter}, d::PSY.TransmissionInterface, ::Type{VariableMaxInterfaceFlow}) = PSY.get_max_active_power_flow_limit(d)

Expand Down
4 changes: 0 additions & 4 deletions src/static_injector_models/hydro_generation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
requires_initialization(::AbstractHydroReservoirFormulation) = false
requires_initialization(::AbstractHydroUnitCommitment) = true

get_variable_multiplier(::Type{<:VariableType}, ::Type{<:PSY.HydroGen}, ::Type{<:AbstractHydroFormulation}) = 1.0
get_variable_multiplier(::Type{ActivePowerPumpVariable}, ::Type{<:PSY.HydroPumpTurbine}, ::Type{<:AbstractHydroPumpFormulation}) = -1.0
get_expression_type_for_reserve(::Type{ActivePowerReserveVariable}, ::Type{<:PSY.HydroGen}, ::Type{<:PSY.Reserve{PSY.ReserveUp}}) = ActivePowerRangeExpressionUB
get_expression_type_for_reserve(::Type{ActivePowerReserveVariable}, ::Type{<:PSY.HydroGen}, ::Type{<:PSY.Reserve{PSY.ReserveDown}}) = ActivePowerRangeExpressionLB

Expand Down Expand Up @@ -36,13 +34,11 @@ get_variable_upper_bound(::Type{EnergyVariable}, d::PSY.HydroGen, ::Type{<:Abstr
get_variable_binary(::Type{ActivePowerInVariable}, ::Type{<:PSY.HydroGen}, ::Type{<:AbstractHydroReservoirFormulation}) = false
get_variable_lower_bound(::Type{ActivePowerInVariable}, d::PSY.HydroGen, ::Type{<:AbstractHydroReservoirFormulation}) = 0.0
get_variable_upper_bound(::Type{ActivePowerInVariable}, d::PSY.HydroGen, ::Type{<:AbstractHydroReservoirFormulation}) = nothing
get_variable_multiplier(::Type{ActivePowerInVariable}, d::Type{<:PSY.HydroGen}, ::Type{<:AbstractHydroReservoirFormulation}) = -1.0

########################### ActivePowerOutVariable, HydroGen #################################
get_variable_binary(::Type{ActivePowerOutVariable}, ::Type{<:PSY.HydroGen}, ::Type{<:AbstractHydroReservoirFormulation}) = false
get_variable_lower_bound(::Type{ActivePowerOutVariable}, d::PSY.HydroGen, ::Type{<:AbstractHydroReservoirFormulation}) = 0.0
get_variable_upper_bound(::Type{ActivePowerOutVariable}, d::PSY.HydroGen, ::Type{<:AbstractHydroReservoirFormulation}) = nothing
get_variable_multiplier(::Type{ActivePowerOutVariable}, d::Type{<:PSY.HydroGen}, ::Type{<:AbstractHydroReservoirFormulation}) = 1.0

############## OnVariable, HydroGen ####################
# These methods are defined in PowerSimulations
Expand Down
1 change: 0 additions & 1 deletion src/static_injector_models/reactivepower_device.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#! format: off

requires_initialization(::AbstractReactivePowerDeviceFormulation) = false
get_variable_multiplier(::Type{<:VariableType}, ::Type{<:PSY.SynchronousCondenser}, ::Type{<:AbstractReactivePowerDeviceFormulation}) = 1.0

############## ReactivePowerVariable, SynchronousCondensers ####################
get_variable_binary(::Type{ReactivePowerVariable}, ::Type{PSY.SynchronousCondenser}, ::Type{<:AbstractReactivePowerDeviceFormulation}) = false
Expand Down
1 change: 0 additions & 1 deletion src/static_injector_models/renewable_generation.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#! format: off
get_variable_multiplier(::Type{<:VariableType}, ::Type{<:PSY.RenewableGen}, ::Type{<:AbstractRenewableFormulation}) = 1.0
get_expression_type_for_reserve(::Type{ActivePowerReserveVariable}, ::Type{<:PSY.RenewableGen}, ::Type{<:PSY.Reserve{PSY.ReserveUp}}) = ActivePowerRangeExpressionUB
get_expression_type_for_reserve(::Type{ActivePowerReserveVariable}, ::Type{<:PSY.RenewableGen}, ::Type{<:PSY.Reserve{PSY.ReserveDown}}) = ActivePowerRangeExpressionLB
########################### ActivePowerVariable, RenewableGen #################################
Expand Down
3 changes: 0 additions & 3 deletions src/static_injector_models/source.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
requires_initialization(::ImportExportSourceModel) = false


get_variable_multiplier(::Type{ActivePowerOutVariable}, ::Type{<:PSY.Source}, ::Type{<:AbstractSourceFormulation}) = 1.0
get_variable_multiplier(::Type{ActivePowerInVariable}, ::Type{<:PSY.Source}, ::Type{<:AbstractSourceFormulation}) = -1.0
get_variable_multiplier(::Type{ReactivePowerVariable}, ::Type{<:PSY.Source}, ::Type{<:AbstractSourceFormulation}) = 1.0
############## ActivePowerVariables, Source ####################
get_variable_binary(::Type{ActivePowerInVariable}, ::Type{<:PSY.Source}, ::Type{<:AbstractSourceFormulation}) = false
get_variable_binary(::Type{ActivePowerOutVariable}, ::Type{<:PSY.Source}, ::Type{<:AbstractSourceFormulation}) = false
Expand Down
2 changes: 0 additions & 2 deletions src/static_injector_models/thermal_generation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,7 @@ requires_initialization(::ThermalStandardDispatch) = true
requires_initialization(::ThermalBasicCompactUnitCommitment) = false
requires_initialization(::ThermalBasicUnitCommitment) = false

get_variable_multiplier(::Type{<:VariableType}, ::Type{<:PSY.ThermalGen}, ::Type{<:AbstractThermalFormulation}) = 1.0
# Per-device P_min multiplier computed inline at add_to_expression! call sites.
get_variable_multiplier(::Type{OnVariable}, ::Type{<:PSY.ThermalGen}, ::Type{<:Union{AbstractCompactUnitCommitment, ThermalCompactDispatch}}) = 1.0
get_expression_type_for_reserve(::Type{ActivePowerReserveVariable}, ::Type{<:PSY.ThermalGen}, ::Type{<:PSY.Reserve{PSY.ReserveUp}}) = ActivePowerRangeExpressionUB
get_expression_type_for_reserve(::Type{ActivePowerReserveVariable}, ::Type{<:PSY.ThermalGen}, ::Type{<:PSY.Reserve{PSY.ReserveDown}}) = ActivePowerRangeExpressionLB

Expand Down
Loading
Loading