Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jd/move energy limit ff out #1014

Merged
merged 4 commits into from
Oct 25, 2023
Merged
Show file tree
Hide file tree
Changes from 2 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
70 changes: 0 additions & 70 deletions src/feedforward/feedforward_constraints.jl
Original file line number Diff line number Diff line change
Expand Up @@ -422,76 +422,6 @@ function add_feedforward_constraints!(
return
end

@doc raw"""
add_feedforward_constraints(container::OptimizationContainer,
cons_name::Symbol,
param_reference,
var_key::VariableKey)

Constructs a parameterized integral limit constraint to implement feedforward from other models.
The Parameters are initialized using the upper boundary values of the provided variables.


``` sum(variable[var_name, t] for t in 1:affected_periods)/affected_periods <= param_reference[var_name] ```

# LaTeX

`` \sum_{t} x \leq param^{max}``

# Arguments
* container::OptimizationContainer : the optimization_container model built in PowerSimulations
* model::DeviceModel : the device model
* devices::IS.FlattenIteratorWrapper{T} : list of devices
* ff::FixValueFeedforward : a instance of the FixValue Feedforward
"""
function add_feedforward_constraints!(
container::OptimizationContainer,
::DeviceModel,
devices::IS.FlattenIteratorWrapper{T},
ff::EnergyLimitFeedforward,
) where {T <: PSY.Component}
time_steps = get_time_steps(container)
parameter_type = get_default_parameter_type(ff, T)
param = get_parameter_array(container, parameter_type(), T)
multiplier = get_parameter_multiplier_array(container, parameter_type(), T)
affected_periods = get_number_of_periods(ff)
for var in get_affected_values(ff)
variable = get_variable(container, var)
set_name, set_time = JuMP.axes(variable)
IS.@assert_op set_name == [PSY.get_name(d) for d in devices]
IS.@assert_op set_time == time_steps

if affected_periods > set_time[end]
error(
"The number of affected periods $affected_periods is larger than the periods available $(set_time[end])",
)
end
no_trenches = set_time[end] ÷ affected_periods
var_type = get_entry_type(var)
con_ub = add_constraints_container!(
container,
FeedforwardIntegralLimitConstraint(),
T,
set_name,
1:no_trenches;
meta = "$(var_type)integral",
)

for name in set_name, i in 1:no_trenches
con_ub[name, i] = JuMP.@constraint(
container.JuMPmodel,
sum(
variable[name, t] for
t in (1 + (i - 1) * affected_periods):(i * affected_periods)
) <= sum(
param[name, t] * multiplier[name, t] for
t in (1 + (i - 1) * affected_periods):(i * affected_periods)
)
)
end
end
return
end

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[JuliaFormatter] reported by reviewdog 🐶

Suggested change

@doc raw"""
add_feedforward_constraints(
Expand Down
75 changes: 0 additions & 75 deletions src/feedforward/feedforwards.jl
Original file line number Diff line number Diff line change
Expand Up @@ -202,42 +202,6 @@ function has_semicontinuous_feedforward(
return has_semicontinuous_feedforward(model, ActivePowerVariable)
end

"""
Adds a constraint to limit the sum of a variable over the number of periods to the source value
"""
struct EnergyLimitFeedforward <: AbstractAffectFeedforward
optimization_container_key::OptimizationContainerKey
affected_values::Vector{<:OptimizationContainerKey}
number_of_periods::Int
function EnergyLimitFeedforward(;
component_type::Type{<:PSY.Component},
source::Type{T},
affected_values::Vector{DataType},
number_of_periods::Int,
meta = CONTAINER_KEY_EMPTY_META,
) where {T}
values_vector = Vector{VariableKey}(undef, length(affected_values))
for (ix, v) in enumerate(affected_values)
if v <: VariableType
values_vector[ix] =
get_optimization_container_key(v(), component_type, meta)
else
error(
"EnergyLimitFeedforward is only compatible with VariableType or ParamterType affected values",
)
end
end
new(
get_optimization_container_key(T(), component_type, meta),
values_vector,
number_of_periods,
)
end
end

get_default_parameter_type(::EnergyLimitFeedforward, _) = EnergyLimitParameter
get_optimization_container_key(ff) = ff.optimization_container_key
get_number_of_periods(ff) = ff.number_of_periods

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[JuliaFormatter] reported by reviewdog 🐶

Suggested change

"""
Fixes a Variable or Parameter Value in the model. Is the only Feed Forward that can be used
Expand Down Expand Up @@ -269,42 +233,3 @@ end

get_default_parameter_type(::FixValueFeedforward, _) = FixValueParameter
get_optimization_container_key(ff::FixValueFeedforward) = ff.optimization_container_key

"""
Adds a constraint to enforce a minimum energy level target with a slack variable associated witha penalty term.
"""
struct EnergyTargetFeedforward <: AbstractAffectFeedforward
optimization_container_key::OptimizationContainerKey
affected_values::Vector{<:OptimizationContainerKey}
target_period::Int
penalty_cost::Float64
function EnergyTargetFeedforward(;
component_type::Type{<:PSY.Component},
source::Type{T},
affected_values::Vector{DataType},
target_period::Int,
penalty_cost::Float64,
meta = CONTAINER_KEY_EMPTY_META,
) where {T}
values_vector = Vector{VariableKey}(undef, length(affected_values))
for (ix, v) in enumerate(affected_values)
if v <: VariableType
values_vector[ix] =
get_optimization_container_key(v(), component_type, meta)
else
error(
"EnergyTargetFeedforward is only compatible with VariableType or ParamterType affected values",
)
end
end
new(
get_optimization_container_key(T(), component_type, meta),
values_vector,
target_period,
penalty_cost,
)
end
end

get_default_parameter_type(::EnergyTargetFeedforward, _) = EnergyTargetParameter
get_optimization_container_key(ff::EnergyTargetFeedforward) = ff.optimization_container_key