From f9b98cdf57ebaedb188d35313d5c46854979d907 Mon Sep 17 00:00:00 2001 From: Andre Date: Thu, 23 Jan 2025 21:29:56 -0300 Subject: [PATCH 1/4] Added name to constraints for better acessibility --- .gitignore | 1 + src/core/constraint.jl | 229 ++++++++++++++++++++++++++++++----------- 2 files changed, 171 insertions(+), 59 deletions(-) diff --git a/.gitignore b/.gitignore index 1874fb591..29b784fdb 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ docs/site/ docs/.documenter .project .tags +.vscode/ \ No newline at end of file diff --git a/src/core/constraint.jl b/src/core/constraint.jl index 645a676c8..c39409bb4 100644 --- a/src/core/constraint.jl +++ b/src/core/constraint.jl @@ -14,99 +14,140 @@ end # Generic thermal limit constraint "`p[f_idx]^2 + q[f_idx]^2 <= rate_a^2`" -function constraint_thermal_limit_from(pm::AbstractPowerModel, n::Int, f_idx, rate_a) +function constraint_thermal_limit_from(pm::AbstractPowerModel, n::Int, f_idx, rate_a; constraint_name=nothing) p_fr = var(pm, n, :p, f_idx) q_fr = var(pm, n, :q, f_idx) - JuMP.@constraint(pm.model, p_fr^2 + q_fr^2 <= rate_a^2) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "thermal_limit_from[$f_idx]" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), p_fr^2 + q_fr^2 <= rate_a^2) end "`p[t_idx]^2 + q[t_idx]^2 <= rate_a^2`" -function constraint_thermal_limit_to(pm::AbstractPowerModel, n::Int, t_idx, rate_a) +function constraint_thermal_limit_to(pm::AbstractPowerModel, n::Int, t_idx, rate_a; constraint_name=nothing) p_to = var(pm, n, :p, t_idx) q_to = var(pm, n, :q, t_idx) - JuMP.@constraint(pm.model, p_to^2 + q_to^2 <= rate_a^2) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "thermal_limit_to[$t_idx]" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), p_to^2 + q_to^2 <= rate_a^2) end "`[rate_a, p[f_idx], q[f_idx]] in SecondOrderCone`" -function constraint_thermal_limit_from(pm::AbstractConicModels, n::Int, f_idx, rate_a) +function constraint_thermal_limit_from(pm::AbstractConicModels, n::Int, f_idx, rate_a; constraint_name=nothing) p_fr = var(pm, n, :p, f_idx) q_fr = var(pm, n, :q, f_idx) - JuMP.@constraint(pm.model, [rate_a, p_fr, q_fr] in JuMP.SecondOrderCone()) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "thermal_limit_from[$f_idx]_SOC" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), [rate_a, p_fr, q_fr] in JuMP.SecondOrderCone()) end "`[rate_a, p[t_idx], q[t_idx]] in SecondOrderCone`" -function constraint_thermal_limit_to(pm::AbstractConicModels, n::Int, t_idx, rate_a) +function constraint_thermal_limit_to(pm::AbstractConicModels, n::Int, t_idx, rate_a; constraint_name=nothing) p_to = var(pm, n, :p, t_idx) q_to = var(pm, n, :q, t_idx) - JuMP.@constraint(pm.model, [rate_a, p_to, q_to] in JuMP.SecondOrderCone()) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "thermal_limit_to[$t_idx]_SOC" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), [rate_a, p_to, q_to] in JuMP.SecondOrderCone()) end # Generic on/off thermal limit constraint "`p[f_idx]^2 + q[f_idx]^2 <= (rate_a * z_branch[i])^2`" -function constraint_thermal_limit_from_on_off(pm::AbstractPowerModel, n::Int, i, f_idx, rate_a) +function constraint_thermal_limit_from_on_off(pm::AbstractPowerModel, n::Int, i, f_idx, rate_a; constraint_name=nothing) p_fr = var(pm, n, :p, f_idx) q_fr = var(pm, n, :q, f_idx) z = var(pm, n, :z_branch, i) - JuMP.@constraint(pm.model, p_fr^2 + q_fr^2 <= rate_a^2*z^2) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "thermal_limit_from[$f_idx]_on_off" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), p_fr^2 + q_fr^2 <= rate_a^2*z^2) end "`p[t_idx]^2 + q[t_idx]^2 <= (rate_a * z_branch[i])^2`" -function constraint_thermal_limit_to_on_off(pm::AbstractPowerModel, n::Int, i, t_idx, rate_a) +function constraint_thermal_limit_to_on_off(pm::AbstractPowerModel, n::Int, i, t_idx, rate_a; constraint_name=nothing) p_to = var(pm, n, :p, t_idx) q_to = var(pm, n, :q, t_idx) z = var(pm, n, :z_branch, i) - JuMP.@constraint(pm.model, p_to^2 + q_to^2 <= rate_a^2*z^2) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "thermal_limit_to[$t_idx]_on_off" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), p_to^2 + q_to^2 <= rate_a^2*z^2) end "`p_ne[f_idx]^2 + q_ne[f_idx]^2 <= (rate_a * branch_ne[i])^2`" -function constraint_ne_thermal_limit_from(pm::AbstractPowerModel, n::Int, i, f_idx, rate_a) +function constraint_ne_thermal_limit_from(pm::AbstractPowerModel, n::Int, i, f_idx, rate_a; constraint_name=nothing) p_fr = var(pm, n, :p_ne, f_idx) q_fr = var(pm, n, :q_ne, f_idx) z = var(pm, n, :branch_ne, i) - JuMP.@constraint(pm.model, p_fr^2 + q_fr^2 <= rate_a^2*z^2) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "ne_thermal_limit_from[$f_idx]" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), p_fr^2 + q_fr^2 <= rate_a^2*z^2) end "`p_ne[t_idx]^2 + q_ne[t_idx]^2 <= (rate_a * branch_ne[i])^2`" -function constraint_ne_thermal_limit_to(pm::AbstractPowerModel, n::Int, i, t_idx, rate_a) +function constraint_ne_thermal_limit_to(pm::AbstractPowerModel, n::Int, i, t_idx, rate_a; constraint_name=nothing) p_to = var(pm, n, :p_ne, t_idx) q_to = var(pm, n, :q_ne, t_idx) z = var(pm, n, :branch_ne, i) - JuMP.@constraint(pm.model, p_to^2 + q_to^2 <= rate_a^2*z^2) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "ne_thermal_limit_to[$t_idx]" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), p_to^2 + q_to^2 <= rate_a^2*z^2) end "`pg[i] == pg`" -function constraint_gen_setpoint_active(pm::AbstractPowerModel, n::Int, i, pg) +function constraint_gen_setpoint_active(pm::AbstractPowerModel, n::Int, i, pg; constraint_name=nothing) pg_var = var(pm, n, :pg, i) - JuMP.@constraint(pm.model, pg_var == pg) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "gen_setpoint_active[$i]" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), pg_var == pg) end "`qq[i] == qq`" -function constraint_gen_setpoint_reactive(pm::AbstractPowerModel, n::Int, i, qg) +function constraint_gen_setpoint_reactive(pm::AbstractPowerModel, n::Int, i, qg; constraint_name=nothing) qg_var = var(pm, n, :qg, i) - JuMP.@constraint(pm.model, qg_var == qg) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "gen_setpoint_reactive[$i]" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), qg_var == qg) end "on/off constraint for generators" -function constraint_gen_power_on_off(pm::AbstractPowerModel, n::Int, i::Int, pmin, pmax, qmin, qmax) +function constraint_gen_power_on_off(pm::AbstractPowerModel, n::Int, i::Int, pmin, pmax, qmin, qmax; constraint_name=nothing) pg = var(pm, n, :pg, i) qg = var(pm, n, :qg, i) z = var(pm, n, :z_gen, i) - JuMP.@constraint(pm.model, pg <= pmax*z) - JuMP.@constraint(pm.model, pg >= pmin*z) - JuMP.@constraint(pm.model, qg <= qmax*z) - JuMP.@constraint(pm.model, qg >= qmin*z) + #Initialize default constraint names if none are provided + if isnothing(constraint_name) + constraint_name = [nothing, nothing, nothing, nothing] + end + + #Generate default name if none is provided + constraint_name[1] = isnothing(constraint_name[1]) ? "gen_active_ub[$i]_on_off" : constraint_name[1] + constraint_name[2] = isnothing(constraint_name[2]) ? "gen_active_lb[$i]_on_off" : constraint_name[2] + constraint_name[3] = isnothing(constraint_name[3]) ? "gen_reactive_ub[$i]_on_off" : constraint_name[3] + constraint_name[4] = isnothing(constraint_name[4]) ? "gen_reactive_lb[$i]_on_off" : constraint_name[4] + + JuMP.@constraint(pm.model, Symbol(constraint_name[1]), pg <= pmax*z) + JuMP.@constraint(pm.model, Symbol(constraint_name[2]), pg >= pmin*z) + JuMP.@constraint(pm.model, Symbol(constraint_name[3]), qg <= qmax*z) + JuMP.@constraint(pm.model, Symbol(constraint_name[4]), qg >= qmin*z) end @@ -117,20 +158,32 @@ Creates Line Flow constraint for DC Lines (Matpower Formulation) p_fr + p_to == loss0 + p_fr * loss1 ``` """ -function constraint_dcline_power_losses(pm::AbstractPowerModel, n::Int, f_bus, t_bus, f_idx, t_idx, loss0, loss1) +function constraint_dcline_power_losses(pm::AbstractPowerModel, n::Int, f_bus, t_bus, f_idx, t_idx, loss0, loss1; constraint_name=nothing) p_fr = var(pm, n, :p_dc, f_idx) p_to = var(pm, n, :p_dc, t_idx) - JuMP.@constraint(pm.model, (1-loss1) * p_fr + (p_to - loss0) == 0) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "dcline_power_losses_from[$f_idx]_to[$t_idx]" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), (1-loss1) * p_fr + (p_to - loss0) == 0) end "`pf[i] == pf, pt[i] == pt`" -function constraint_dcline_setpoint_active(pm::AbstractPowerModel, n::Int, f_idx, t_idx, pf, pt) +function constraint_dcline_setpoint_active(pm::AbstractPowerModel, n::Int, f_idx, t_idx, pf, pt; constraint_name=nothing) p_fr = var(pm, n, :p_dc, f_idx) p_to = var(pm, n, :p_dc, t_idx) - JuMP.@constraint(pm.model, p_fr == pf) - JuMP.@constraint(pm.model, p_to == pt) + #Initialize default constraint names if none are provided + if isnothing(constraint_name) + constraint_name = [nothing, nothing] + end + + #Generate default name if none is provided + constraint_name[1] = isnothing(constraint_name[1]) ? "dcline_setpoint_active_from[$f_idx]" : constraint_name[1] + constraint_name[2] = isnothing(constraint_name[2]) ? "dcline_setpoint_active_to[$t_idx]" : constraint_name[2] + + JuMP.@constraint(pm.model, Symbol(constraint_name[1]), p_fr == pf) + JuMP.@constraint(pm.model, Symbol(constraint_name[2]), p_to == pt) end @@ -160,24 +213,36 @@ end "" -function constraint_switch_state_open(pm::AbstractPowerModel, n::Int, f_idx) +function constraint_switch_state_open(pm::AbstractPowerModel, n::Int, f_idx; constraint_name=nothing) psw = var(pm, n, :psw, f_idx) qsw = var(pm, n, :qsw, f_idx) - JuMP.@constraint(pm.model, psw == 0.0) - JuMP.@constraint(pm.model, qsw == 0.0) + #Initialize default constraint names if none are provided + if isnothing(constraint_name) + constraint_name = [nothing, nothing] + end + + #Generate default name if none is provided + constraint_name[1] = isnothing(constraint_name[1]) ? "switch[$f_idx]_state_open_active" : constraint_name[1] + constraint_name[2] = isnothing(constraint_name[2]) ? "switch[$f_idx]_state_open_reactive" : constraint_name[2] + + JuMP.@constraint(pm.model, Symbol(constraint_name[1]), psw == 0.0) + JuMP.@constraint(pm.model, Symbol(constraint_name[2]), qsw == 0.0) end "" -function constraint_switch_thermal_limit(pm::AbstractPowerModel, n::Int, f_idx, rating) +function constraint_switch_thermal_limit(pm::AbstractPowerModel, n::Int, f_idx, rating; constraint_name=nothing) psw = var(pm, n, :psw, f_idx) qsw = var(pm, n, :qsw, f_idx) - JuMP.@constraint(pm.model, psw^2 + qsw^2 <= rating^2) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "switch[$f_idx]_thermal_limit" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), psw^2 + qsw^2 <= rating^2) end "" -function constraint_switch_power_on_off(pm::AbstractPowerModel, n::Int, i, f_idx) +function constraint_switch_power_on_off(pm::AbstractPowerModel, n::Int, i, f_idx; constraint_name=nothing) psw = var(pm, n, :psw, f_idx) qsw = var(pm, n, :qsw, f_idx) z = var(pm, n, :z_switch, i) @@ -185,73 +250,119 @@ function constraint_switch_power_on_off(pm::AbstractPowerModel, n::Int, i, f_idx psw_lb, psw_ub = _IM.variable_domain(psw) qsw_lb, qsw_ub = _IM.variable_domain(qsw) - JuMP.@constraint(pm.model, psw <= psw_ub*z) - JuMP.@constraint(pm.model, psw >= psw_lb*z) - JuMP.@constraint(pm.model, qsw <= qsw_ub*z) - JuMP.@constraint(pm.model, qsw >= qsw_lb*z) + #Initialize default constraint names if none are provided + if isnothing(constraint_name) + constraint_name = [nothing, nothing, nothing, nothing] + end + + #Generate default name if none is provided + constraint_name[1] = isnothing(constraint_name[1]) ? "switch[$f_idx]_active_ub_on_off" : constraint_name[1] + constraint_name[2] = isnothing(constraint_name[2]) ? "switch[$f_idx]_active_lb_on_off" : constraint_name[2] + constraint_name[3] = isnothing(constraint_name[3]) ? "switch[$f_idx]_reactive_ub_on_off" : constraint_name[3] + constraint_name[4] = isnothing(constraint_name[4]) ? "switch[$f_idx]_reactive_lb_on_off" : constraint_name[4] + + JuMP.@constraint(pm.model, Symbol(constraint_name[1]), psw <= psw_ub*z) + JuMP.@constraint(pm.model, Symbol(constraint_name[2]), psw >= psw_lb*z) + JuMP.@constraint(pm.model, Symbol(constraint_name[3]), qsw <= qsw_ub*z) + JuMP.@constraint(pm.model, Symbol(constraint_name[4]), qsw >= qsw_lb*z) end "" -function constraint_storage_thermal_limit(pm::AbstractPowerModel, n::Int, i, rating) +function constraint_storage_thermal_limit(pm::AbstractPowerModel, n::Int, i, rating; constraint_name=nothing) ps = var(pm, n, :ps, i) qs = var(pm, n, :qs, i) - JuMP.@constraint(pm.model, ps^2 + qs^2 <= rating^2) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "storage[$i]_thermal_limit" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), ps^2 + qs^2 <= rating^2) end "" -function constraint_storage_state_initial(pm::AbstractPowerModel, n::Int, i::Int, energy, charge_eff, discharge_eff, time_elapsed) +function constraint_storage_state_initial(pm::AbstractPowerModel, n::Int, i::Int, energy, charge_eff, discharge_eff, time_elapsed; constraint_name=nothing) sc = var(pm, n, :sc, i) sd = var(pm, n, :sd, i) se = var(pm, n, :se, i) - JuMP.@constraint(pm.model, se - energy == time_elapsed*(charge_eff*sc - sd/discharge_eff)) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "storage[$i]_state_initial" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), se - energy == time_elapsed*(charge_eff*sc - sd/discharge_eff)) end "" -function constraint_storage_state(pm::AbstractPowerModel, n_1::Int, n_2::Int, i::Int, charge_eff, discharge_eff, time_elapsed) +function constraint_storage_state(pm::AbstractPowerModel, n_1::Int, n_2::Int, i::Int, charge_eff, discharge_eff, time_elapsed; constraint_name=nothing) sc_2 = var(pm, n_2, :sc, i) sd_2 = var(pm, n_2, :sd, i) se_2 = var(pm, n_2, :se, i) se_1 = var(pm, n_1, :se, i) - JuMP.@constraint(pm.model, se_2 - se_1 == time_elapsed*(charge_eff*sc_2 - sd_2/discharge_eff)) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "storage[$i]_state" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), se_2 - se_1 == time_elapsed*(charge_eff*sc_2 - sd_2/discharge_eff)) end "" -function constraint_storage_complementarity_nl(pm::AbstractPowerModel, n::Int, i) +function constraint_storage_complementarity_nl(pm::AbstractPowerModel, n::Int, i; constraint_name=nothing) sc = var(pm, n, :sc, i) sd = var(pm, n, :sd, i) - JuMP.@constraint(pm.model, sc*sd == 0.0) + #Generate default name if none is provided + constraint_name = isnothing(constraint_name) ? "storage[$i]_complementarity_nl" : constraint_name + + JuMP.@constraint(pm.model, Symbol(constraint_name), sc*sd == 0.0) end "" -function constraint_storage_complementarity_mi(pm::AbstractPowerModel, n::Int, i, charge_ub, discharge_ub) +function constraint_storage_complementarity_mi(pm::AbstractPowerModel, n::Int, i, charge_ub, discharge_ub; constraint_name=nothing) sc = var(pm, n, :sc, i) sd = var(pm, n, :sd, i) sc_on = var(pm, n, :sc_on, i) sd_on = var(pm, n, :sd_on, i) - JuMP.@constraint(pm.model, sc_on + sd_on == 1) - JuMP.@constraint(pm.model, sc_on*charge_ub >= sc) - JuMP.@constraint(pm.model, sd_on*discharge_ub >= sd) + #Initialize default constraint names if none are provided + if isnothing(constraint_name) + constraint_name = [nothing, nothing, nothing] + end + + #Generate default name if none is provided + constraint_name[1] = isnothing(constraint_name[1]) ? "storage[$i]_complementarity_mi" : constraint_name[1] + constraint_name[2] = isnothing(constraint_name[2]) ? "storage[$i]_charge_ub" : constraint_name[2] + constraint_name[3] = isnothing(constraint_name[3]) ? "storage[$i]_discharge_ub" : constraint_name[3] + + JuMP.@constraint(pm.model, Symbol(constraint_name[1]), sc_on + sd_on == 1) + JuMP.@constraint(pm.model, Symbol(constraint_name[2]), sc_on*charge_ub >= sc) + JuMP.@constraint(pm.model, Symbol(constraint_name[3]), sd_on*discharge_ub >= sd) end "" -function constraint_storage_on_off(pm::AbstractPowerModel, n::Int, i, pmin, pmax, qmin, qmax, charge_ub, discharge_ub) +function constraint_storage_on_off(pm::AbstractPowerModel, n::Int, i, pmin, pmax, qmin, qmax, charge_ub, discharge_ub; constraint_name=nothing) z_storage = var(pm, n, :z_storage, i) ps = var(pm, n, :ps, i) qs = var(pm, n, :qs, i) qsc = var(pm, n, :qsc, i) - JuMP.@constraint(pm.model, ps <= z_storage*pmax) - JuMP.@constraint(pm.model, ps >= z_storage*pmin) - JuMP.@constraint(pm.model, qs <= z_storage*qmax) - JuMP.@constraint(pm.model, qs >= z_storage*qmin) - JuMP.@constraint(pm.model, qsc <= z_storage*qmax) - JuMP.@constraint(pm.model, qsc >= z_storage*qmin) + #Initialize default constraint names if none are provided + if isnothing(constraint_name) + constraint_name = [nothing, nothing, nothing, nothing, nothing, nothing] + end + + #Generate default name if none is provided + constraint_name[1] = isnothing(constraint_name[1]) ? "storage[$i]_active_ub_on_off" : constraint_name[1] + constraint_name[2] = isnothing(constraint_name[2]) ? "storage[$i]_active_lb_on_off" : constraint_name[2] + constraint_name[3] = isnothing(constraint_name[3]) ? "storage[$i]_reactive_ub_on_off" : constraint_name[3] + constraint_name[4] = isnothing(constraint_name[4]) ? "storage[$i]_reactive_lb_on_off" : constraint_name[4] + constraint_name[5] = isnothing(constraint_name[5]) ? "storage[$i]_reactive_charge_ub_on_off" : constraint_name[5] + constraint_name[6] = isnothing(constraint_name[6]) ? "storage[$i]_reactive_charge_lb_on_off" : constraint_name[6] + + JuMP.@constraint(pm.model, Symbol(constraint_name[1]), ps <= z_storage*pmax) + JuMP.@constraint(pm.model, Symbol(constraint_name[2]), ps >= z_storage*pmin) + JuMP.@constraint(pm.model, Symbol(constraint_name[3]), qs <= z_storage*qmax) + JuMP.@constraint(pm.model, Symbol(constraint_name[4]), qs >= z_storage*qmin) + JuMP.@constraint(pm.model, Symbol(constraint_name[5]), qsc <= z_storage*qmax) + JuMP.@constraint(pm.model, Symbol(constraint_name[6]), qsc >= z_storage*qmin) end From 33e6d2cfa12877d34a41f65136d5246fade66257 Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 5 Feb 2025 14:43:03 -0300 Subject: [PATCH 2/4] Saving changes before switching branches --- .gitignore | 3 +- .vscode/settings.json | 3 + src/core/constraint.jl | 284 ++++++++++++++++------------------------- 3 files changed, 113 insertions(+), 177 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index 29b784fdb..6da2c1c9b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,4 @@ docs/build/ docs/site/ docs/.documenter .project -.tags -.vscode/ \ No newline at end of file +.tags \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..fe58ee881 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "julia.environmentPath": "c:\\Users\\André\\OneDrive\\Área de Trabalho\\PowerModels.jl" +} \ No newline at end of file diff --git a/src/core/constraint.jl b/src/core/constraint.jl index c39409bb4..8b439b9c4 100644 --- a/src/core/constraint.jl +++ b/src/core/constraint.jl @@ -14,140 +14,114 @@ end # Generic thermal limit constraint "`p[f_idx]^2 + q[f_idx]^2 <= rate_a^2`" -function constraint_thermal_limit_from(pm::AbstractPowerModel, n::Int, f_idx, rate_a; constraint_name=nothing) +function constraint_thermal_limit_from(pm::AbstractPowerModel, n::Int, f_idx, rate_a; name="thermal_limit_from[$f_idx]") p_fr = var(pm, n, :p, f_idx) q_fr = var(pm, n, :q, f_idx) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "thermal_limit_from[$f_idx]" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), p_fr^2 + q_fr^2 <= rate_a^2) + c = JuMP.@constraint(pm.model, p_fr^2 + q_fr^2 <= rate_a^2, base_name=name) + pm.model[Symbol(name)] = c end "`p[t_idx]^2 + q[t_idx]^2 <= rate_a^2`" -function constraint_thermal_limit_to(pm::AbstractPowerModel, n::Int, t_idx, rate_a; constraint_name=nothing) +function constraint_thermal_limit_to(pm::AbstractPowerModel, n::Int, t_idx, rate_a; name="thermal_limit_to[$t_idx]") p_to = var(pm, n, :p, t_idx) q_to = var(pm, n, :q, t_idx) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "thermal_limit_to[$t_idx]" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), p_to^2 + q_to^2 <= rate_a^2) + c = JuMP.@constraint(pm.model, p_to^2 + q_to^2 <= rate_a^2, base_name=name) + pm.model[Symbol(name)] = c end "`[rate_a, p[f_idx], q[f_idx]] in SecondOrderCone`" -function constraint_thermal_limit_from(pm::AbstractConicModels, n::Int, f_idx, rate_a; constraint_name=nothing) +function constraint_thermal_limit_from(pm::AbstractConicModels, n::Int, f_idx, rate_a; name="thermal_limit_from[$f_idx]_SOC") p_fr = var(pm, n, :p, f_idx) q_fr = var(pm, n, :q, f_idx) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "thermal_limit_from[$f_idx]_SOC" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), [rate_a, p_fr, q_fr] in JuMP.SecondOrderCone()) + c = JuMP.@constraint(pm.model, [rate_a, p_fr, q_fr] in JuMP.SecondOrderCone(), base_name=name) + pm.model[Symbol(name)] = c end "`[rate_a, p[t_idx], q[t_idx]] in SecondOrderCone`" -function constraint_thermal_limit_to(pm::AbstractConicModels, n::Int, t_idx, rate_a; constraint_name=nothing) +function constraint_thermal_limit_to(pm::AbstractConicModels, n::Int, t_idx, rate_a; name="thermal_limit_to[$t_idx]_SOC") p_to = var(pm, n, :p, t_idx) q_to = var(pm, n, :q, t_idx) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "thermal_limit_to[$t_idx]_SOC" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), [rate_a, p_to, q_to] in JuMP.SecondOrderCone()) + c = JuMP.@constraint(pm.model, [rate_a, p_to, q_to] in JuMP.SecondOrderCone(), base_name=name) + pm.model[Symbol(name)] = c end # Generic on/off thermal limit constraint "`p[f_idx]^2 + q[f_idx]^2 <= (rate_a * z_branch[i])^2`" -function constraint_thermal_limit_from_on_off(pm::AbstractPowerModel, n::Int, i, f_idx, rate_a; constraint_name=nothing) +function constraint_thermal_limit_from_on_off(pm::AbstractPowerModel, n::Int, i, f_idx, rate_a; name="thermal_limit_from[$f_idx]_on_off") p_fr = var(pm, n, :p, f_idx) q_fr = var(pm, n, :q, f_idx) z = var(pm, n, :z_branch, i) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "thermal_limit_from[$f_idx]_on_off" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), p_fr^2 + q_fr^2 <= rate_a^2*z^2) + c = JuMP.@constraint(pm.model, p_fr^2 + q_fr^2 <= rate_a^2*z^2, base_name=name) + pm.model[Symbol(name)] = c end "`p[t_idx]^2 + q[t_idx]^2 <= (rate_a * z_branch[i])^2`" -function constraint_thermal_limit_to_on_off(pm::AbstractPowerModel, n::Int, i, t_idx, rate_a; constraint_name=nothing) +function constraint_thermal_limit_to_on_off(pm::AbstractPowerModel, n::Int, i, t_idx, rate_a; name="thermal_limit_to[$t_idx]_on_off") p_to = var(pm, n, :p, t_idx) q_to = var(pm, n, :q, t_idx) z = var(pm, n, :z_branch, i) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "thermal_limit_to[$t_idx]_on_off" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), p_to^2 + q_to^2 <= rate_a^2*z^2) + c = JuMP.@constraint(pm.model, p_to^2 + q_to^2 <= rate_a^2*z^2, base_name=name) + pm.model[Symbol(name)] = c end "`p_ne[f_idx]^2 + q_ne[f_idx]^2 <= (rate_a * branch_ne[i])^2`" -function constraint_ne_thermal_limit_from(pm::AbstractPowerModel, n::Int, i, f_idx, rate_a; constraint_name=nothing) +function constraint_ne_thermal_limit_from(pm::AbstractPowerModel, n::Int, i, f_idx, rate_a; name="ne_thermal_limit_from[$f_idx]") p_fr = var(pm, n, :p_ne, f_idx) q_fr = var(pm, n, :q_ne, f_idx) z = var(pm, n, :branch_ne, i) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "ne_thermal_limit_from[$f_idx]" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), p_fr^2 + q_fr^2 <= rate_a^2*z^2) + c = JuMP.@constraint(pm.model, p_fr^2 + q_fr^2 <= rate_a^2*z^2, base_name=name) + pm.model[Symbol(name)] = c end "`p_ne[t_idx]^2 + q_ne[t_idx]^2 <= (rate_a * branch_ne[i])^2`" -function constraint_ne_thermal_limit_to(pm::AbstractPowerModel, n::Int, i, t_idx, rate_a; constraint_name=nothing) +function constraint_ne_thermal_limit_to(pm::AbstractPowerModel, n::Int, i, t_idx, rate_a; name="ne_thermal_limit_to[$t_idx]") p_to = var(pm, n, :p_ne, t_idx) q_to = var(pm, n, :q_ne, t_idx) z = var(pm, n, :branch_ne, i) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "ne_thermal_limit_to[$t_idx]" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), p_to^2 + q_to^2 <= rate_a^2*z^2) + c = JuMP.@constraint(pm.model, p_to^2 + q_to^2 <= rate_a^2*z^2, base_name=name) + pm.model[Symbol(name)] = c end "`pg[i] == pg`" -function constraint_gen_setpoint_active(pm::AbstractPowerModel, n::Int, i, pg; constraint_name=nothing) +function constraint_gen_setpoint_active(pm::AbstractPowerModel, n::Int, i, pg; name="gen_setpoint_active[$i]") pg_var = var(pm, n, :pg, i) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "gen_setpoint_active[$i]" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), pg_var == pg) + c = JuMP.@constraint(pm.model, pg_var == pg, base_name=name) + pm.model[Symbol(name)] = c end "`qq[i] == qq`" -function constraint_gen_setpoint_reactive(pm::AbstractPowerModel, n::Int, i, qg; constraint_name=nothing) +function constraint_gen_setpoint_reactive(pm::AbstractPowerModel, n::Int, i, qg; name="gen_setpoint_reactive[$i]") qg_var = var(pm, n, :qg, i) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "gen_setpoint_reactive[$i]" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), qg_var == qg) + c = JuMP.@constraint(pm.model, qg_var == qg, base_name=name) + pm.model[Symbol(name)] = c end "on/off constraint for generators" -function constraint_gen_power_on_off(pm::AbstractPowerModel, n::Int, i::Int, pmin, pmax, qmin, qmax; constraint_name=nothing) +function constraint_gen_power_on_off(pm::AbstractPowerModel, n::Int, i::Int, pmin, pmax, qmin, qmax; name= + ["gen_active_ub[$i]_on_off", "gen_active_lb[$i]_on_off", "gen_reactive_ub[$i]_on_off", "gen_reactive_lb[$i]_on_off"]) pg = var(pm, n, :pg, i) qg = var(pm, n, :qg, i) z = var(pm, n, :z_gen, i) - #Initialize default constraint names if none are provided - if isnothing(constraint_name) - constraint_name = [nothing, nothing, nothing, nothing] - end - - #Generate default name if none is provided - constraint_name[1] = isnothing(constraint_name[1]) ? "gen_active_ub[$i]_on_off" : constraint_name[1] - constraint_name[2] = isnothing(constraint_name[2]) ? "gen_active_lb[$i]_on_off" : constraint_name[2] - constraint_name[3] = isnothing(constraint_name[3]) ? "gen_reactive_ub[$i]_on_off" : constraint_name[3] - constraint_name[4] = isnothing(constraint_name[4]) ? "gen_reactive_lb[$i]_on_off" : constraint_name[4] - - JuMP.@constraint(pm.model, Symbol(constraint_name[1]), pg <= pmax*z) - JuMP.@constraint(pm.model, Symbol(constraint_name[2]), pg >= pmin*z) - JuMP.@constraint(pm.model, Symbol(constraint_name[3]), qg <= qmax*z) - JuMP.@constraint(pm.model, Symbol(constraint_name[4]), qg >= qmin*z) + c1 = JuMP.@constraint(pm.model, pg <= pmax*z, base_name=name[1]) + c2 = JuMP.@constraint(pm.model, pg >= pmin*z, base_name=name[2]) + c3 = JuMP.@constraint(pm.model, qg <= qmax*z, base_name=name[3]) + c4 = JuMP.@constraint(pm.model, qg >= qmin*z, base_name=name[4]) + pm.model[Symbol(name[1])] = c1 + pm.model[Symbol(name[2])] = c2 + pm.model[Symbol(name[3])] = c3 + pm.model[Symbol(name[4])] = c4 end @@ -158,32 +132,25 @@ Creates Line Flow constraint for DC Lines (Matpower Formulation) p_fr + p_to == loss0 + p_fr * loss1 ``` """ -function constraint_dcline_power_losses(pm::AbstractPowerModel, n::Int, f_bus, t_bus, f_idx, t_idx, loss0, loss1; constraint_name=nothing) +function constraint_dcline_power_losses(pm::AbstractPowerModel, n::Int, f_bus, t_bus, f_idx, t_idx, loss0, loss1; name= + "dcline_power_losses_from[$f_idx]_to[$t_idx]") p_fr = var(pm, n, :p_dc, f_idx) p_to = var(pm, n, :p_dc, t_idx) - - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "dcline_power_losses_from[$f_idx]_to[$t_idx]" : constraint_name - JuMP.@constraint(pm.model, Symbol(constraint_name), (1-loss1) * p_fr + (p_to - loss0) == 0) + c = JuMP.@constraint(pm.model, (1-loss1) * p_fr + (p_to - loss0) == 0, base_name=name) + pm.model[Symbol(name)] = c end "`pf[i] == pf, pt[i] == pt`" -function constraint_dcline_setpoint_active(pm::AbstractPowerModel, n::Int, f_idx, t_idx, pf, pt; constraint_name=nothing) +function constraint_dcline_setpoint_active(pm::AbstractPowerModel, n::Int, f_idx, t_idx, pf, pt; name= + ["dcline_setpoint_active_from[$f_idx]", "dcline_setpoint_active_to[$t_idx]"]) p_fr = var(pm, n, :p_dc, f_idx) p_to = var(pm, n, :p_dc, t_idx) - - #Initialize default constraint names if none are provided - if isnothing(constraint_name) - constraint_name = [nothing, nothing] - end - - #Generate default name if none is provided - constraint_name[1] = isnothing(constraint_name[1]) ? "dcline_setpoint_active_from[$f_idx]" : constraint_name[1] - constraint_name[2] = isnothing(constraint_name[2]) ? "dcline_setpoint_active_to[$t_idx]" : constraint_name[2] - - JuMP.@constraint(pm.model, Symbol(constraint_name[1]), p_fr == pf) - JuMP.@constraint(pm.model, Symbol(constraint_name[2]), p_to == pt) + + c1 = JuMP.@constraint(pm.model, p_fr == pf, base_name=name[1]) + c2 = JuMP.@constraint(pm.model, p_to == pt, base_name=name[2]) + pm.model[Symbol(name[1])] = c1 + pm.model[Symbol(name[2])] = c2 end @@ -213,156 +180,123 @@ end "" -function constraint_switch_state_open(pm::AbstractPowerModel, n::Int, f_idx; constraint_name=nothing) +function constraint_switch_state_open(pm::AbstractPowerModel, n::Int, f_idx; name= + ["switch[$f_idx]_state_open_active", "switch[$f_idx]_state_open_reactive"]) psw = var(pm, n, :psw, f_idx) qsw = var(pm, n, :qsw, f_idx) - #Initialize default constraint names if none are provided - if isnothing(constraint_name) - constraint_name = [nothing, nothing] - end - - #Generate default name if none is provided - constraint_name[1] = isnothing(constraint_name[1]) ? "switch[$f_idx]_state_open_active" : constraint_name[1] - constraint_name[2] = isnothing(constraint_name[2]) ? "switch[$f_idx]_state_open_reactive" : constraint_name[2] - - JuMP.@constraint(pm.model, Symbol(constraint_name[1]), psw == 0.0) - JuMP.@constraint(pm.model, Symbol(constraint_name[2]), qsw == 0.0) + c1 = JuMP.@constraint(pm.model, psw == 0.0, base_name=name[1]) + c2 = JuMP.@constraint(pm.model, qsw == 0.0, base_name=name[2]) + pm.model[Symbol(name[1])] = c1 + pm.model[Symbol(name[2])] = c2 end "" -function constraint_switch_thermal_limit(pm::AbstractPowerModel, n::Int, f_idx, rating; constraint_name=nothing) +function constraint_switch_thermal_limit(pm::AbstractPowerModel, n::Int, f_idx, rating; name= + "switch[$f_idx]_thermal_limit") psw = var(pm, n, :psw, f_idx) qsw = var(pm, n, :qsw, f_idx) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "switch[$f_idx]_thermal_limit" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), psw^2 + qsw^2 <= rating^2) + c = JuMP.@constraint(pm.model, psw^2 + qsw^2 <= rating^2, base_name=name) + pm.model[Symbol(name)] = c end "" -function constraint_switch_power_on_off(pm::AbstractPowerModel, n::Int, i, f_idx; constraint_name=nothing) +function constraint_switch_power_on_off(pm::AbstractPowerModel, n::Int, i, f_idx; name= + ["switch[$f_idx]_active_ub_on_off", "switch[$f_idx]_active_lb_on_off", "switch[$f_idx]_reactive_ub_on_off", "switch[$f_idx]_reactive_lb_on_off"]) psw = var(pm, n, :psw, f_idx) qsw = var(pm, n, :qsw, f_idx) z = var(pm, n, :z_switch, i) - psw_lb, psw_ub = _IM.variable_domain(psw) - qsw_lb, qsw_ub = _IM.variable_domain(qsw) - - #Initialize default constraint names if none are provided - if isnothing(constraint_name) - constraint_name = [nothing, nothing, nothing, nothing] - end - - #Generate default name if none is provided - constraint_name[1] = isnothing(constraint_name[1]) ? "switch[$f_idx]_active_ub_on_off" : constraint_name[1] - constraint_name[2] = isnothing(constraint_name[2]) ? "switch[$f_idx]_active_lb_on_off" : constraint_name[2] - constraint_name[3] = isnothing(constraint_name[3]) ? "switch[$f_idx]_reactive_ub_on_off" : constraint_name[3] - constraint_name[4] = isnothing(constraint_name[4]) ? "switch[$f_idx]_reactive_lb_on_off" : constraint_name[4] - - JuMP.@constraint(pm.model, Symbol(constraint_name[1]), psw <= psw_ub*z) - JuMP.@constraint(pm.model, Symbol(constraint_name[2]), psw >= psw_lb*z) - JuMP.@constraint(pm.model, Symbol(constraint_name[3]), qsw <= qsw_ub*z) - JuMP.@constraint(pm.model, Symbol(constraint_name[4]), qsw >= qsw_lb*z) + c1 = JuMP.@constraint(pm.model, psw <= psw_ub*z, base_name=name[1]) + c2 = JuMP.@constraint(pm.model, psw >= psw_lb*z, base_name=name[2]) + c3 = JuMP.@constraint(pm.model, qsw <= qsw_ub*z, base_name=name[3]) + c4 = JuMP.@constraint(pm.model, qsw >= qsw_lb*z, base_name=name[4]) + pm.model[Symbol(name[1])] = c1 + pm.model[Symbol(name[2])] = c2 + pm.model[Symbol(name[3])] = c3 + pm.model[Symbol(name[4])] = c4 end "" -function constraint_storage_thermal_limit(pm::AbstractPowerModel, n::Int, i, rating; constraint_name=nothing) +function constraint_storage_thermal_limit(pm::AbstractPowerModel, n::Int, i, rating; name="storage[$i]_thermal_limit") ps = var(pm, n, :ps, i) qs = var(pm, n, :qs, i) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "storage[$i]_thermal_limit" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), ps^2 + qs^2 <= rating^2) + c = JuMP.@constraint(pm.model, ps^2 + qs^2 <= rating^2, base_name=name) + pm.model[Symbol(name)] = c end "" -function constraint_storage_state_initial(pm::AbstractPowerModel, n::Int, i::Int, energy, charge_eff, discharge_eff, time_elapsed; constraint_name=nothing) +function constraint_storage_state_initial(pm::AbstractPowerModel, n::Int, i::Int, energy, charge_eff, discharge_eff, time_elapsed; name= + "storage[$i]_state_initial") sc = var(pm, n, :sc, i) sd = var(pm, n, :sd, i) se = var(pm, n, :se, i) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "storage[$i]_state_initial" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), se - energy == time_elapsed*(charge_eff*sc - sd/discharge_eff)) + c = JuMP.@constraint(pm.model, se - energy == time_elapsed*(charge_eff*sc - sd/discharge_eff), base_name=name) + pm.model[Symbol(name)] = c end "" -function constraint_storage_state(pm::AbstractPowerModel, n_1::Int, n_2::Int, i::Int, charge_eff, discharge_eff, time_elapsed; constraint_name=nothing) +function constraint_storage_state(pm::AbstractPowerModel, n_1::Int, n_2::Int, i::Int, charge_eff, discharge_eff, time_elapsed; name= + "storage[$i]_state") sc_2 = var(pm, n_2, :sc, i) sd_2 = var(pm, n_2, :sd, i) se_2 = var(pm, n_2, :se, i) se_1 = var(pm, n_1, :se, i) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "storage[$i]_state" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), se_2 - se_1 == time_elapsed*(charge_eff*sc_2 - sd_2/discharge_eff)) + c = JuMP.@constraint(pm.model, se_2 - se_1 == time_elapsed*(charge_eff*sc_2 - sd_2/discharge_eff), base_name=name) + pm.model[Symbol(name)] = c end "" -function constraint_storage_complementarity_nl(pm::AbstractPowerModel, n::Int, i; constraint_name=nothing) +function constraint_storage_complementarity_nl(pm::AbstractPowerModel, n::Int, i; name="storage[$i]_complementarity_nl") sc = var(pm, n, :sc, i) sd = var(pm, n, :sd, i) - #Generate default name if none is provided - constraint_name = isnothing(constraint_name) ? "storage[$i]_complementarity_nl" : constraint_name - - JuMP.@constraint(pm.model, Symbol(constraint_name), sc*sd == 0.0) + c = JuMP.@constraint(pm.model, sc*sd == 0.0, base_name=name) + pm.model[Symbol(name)] = c end "" -function constraint_storage_complementarity_mi(pm::AbstractPowerModel, n::Int, i, charge_ub, discharge_ub; constraint_name=nothing) +function constraint_storage_complementarity_mi(pm::AbstractPowerModel, n::Int, i, charge_ub, discharge_ub; name= + ["storage[$i]_complementarity_mi", "storage[$i]_charge_ub", "storage[$i]_discharge_ub"]) sc = var(pm, n, :sc, i) sd = var(pm, n, :sd, i) sc_on = var(pm, n, :sc_on, i) sd_on = var(pm, n, :sd_on, i) - #Initialize default constraint names if none are provided - if isnothing(constraint_name) - constraint_name = [nothing, nothing, nothing] - end - - #Generate default name if none is provided - constraint_name[1] = isnothing(constraint_name[1]) ? "storage[$i]_complementarity_mi" : constraint_name[1] - constraint_name[2] = isnothing(constraint_name[2]) ? "storage[$i]_charge_ub" : constraint_name[2] - constraint_name[3] = isnothing(constraint_name[3]) ? "storage[$i]_discharge_ub" : constraint_name[3] - - JuMP.@constraint(pm.model, Symbol(constraint_name[1]), sc_on + sd_on == 1) - JuMP.@constraint(pm.model, Symbol(constraint_name[2]), sc_on*charge_ub >= sc) - JuMP.@constraint(pm.model, Symbol(constraint_name[3]), sd_on*discharge_ub >= sd) + c1 = JuMP.@constraint(pm.model, sc_on + sd_on == 1, base_name=name[1]) + c2 = JuMP.@constraint(pm.model, sc_on*charge_ub >= sc, base_name=name[2]) + c3 = JuMP.@constraint(pm.model, sd_on*discharge_ub >= sd, base_name=name[3]) + pm.model[Symbol(name[1])] = c1 + pm.model[Symbol(name[2])] = c2 + pm.model[Symbol(name[3])] = c3 end "" -function constraint_storage_on_off(pm::AbstractPowerModel, n::Int, i, pmin, pmax, qmin, qmax, charge_ub, discharge_ub; constraint_name=nothing) +function constraint_storage_on_off(pm::AbstractPowerModel, n::Int, i, pmin, pmax, qmin, qmax, charge_ub, discharge_ub; name= + ["storage[$i]_active_ub_on_off", "storage[$i]_active_lb_on_off", "storage[$i]_reactive_ub_on_off", "storage[$i]_reactive_lb_on_off", + "storage[$i]_reactive_charge_ub_on_off", "storage[$i]_reactive_charge_lb_on_off"]) z_storage = var(pm, n, :z_storage, i) ps = var(pm, n, :ps, i) qs = var(pm, n, :qs, i) qsc = var(pm, n, :qsc, i) - #Initialize default constraint names if none are provided - if isnothing(constraint_name) - constraint_name = [nothing, nothing, nothing, nothing, nothing, nothing] - end - - #Generate default name if none is provided - constraint_name[1] = isnothing(constraint_name[1]) ? "storage[$i]_active_ub_on_off" : constraint_name[1] - constraint_name[2] = isnothing(constraint_name[2]) ? "storage[$i]_active_lb_on_off" : constraint_name[2] - constraint_name[3] = isnothing(constraint_name[3]) ? "storage[$i]_reactive_ub_on_off" : constraint_name[3] - constraint_name[4] = isnothing(constraint_name[4]) ? "storage[$i]_reactive_lb_on_off" : constraint_name[4] - constraint_name[5] = isnothing(constraint_name[5]) ? "storage[$i]_reactive_charge_ub_on_off" : constraint_name[5] - constraint_name[6] = isnothing(constraint_name[6]) ? "storage[$i]_reactive_charge_lb_on_off" : constraint_name[6] - - JuMP.@constraint(pm.model, Symbol(constraint_name[1]), ps <= z_storage*pmax) - JuMP.@constraint(pm.model, Symbol(constraint_name[2]), ps >= z_storage*pmin) - JuMP.@constraint(pm.model, Symbol(constraint_name[3]), qs <= z_storage*qmax) - JuMP.@constraint(pm.model, Symbol(constraint_name[4]), qs >= z_storage*qmin) - JuMP.@constraint(pm.model, Symbol(constraint_name[5]), qsc <= z_storage*qmax) - JuMP.@constraint(pm.model, Symbol(constraint_name[6]), qsc >= z_storage*qmin) -end + c1 = JuMP.@constraint(pm.model, ps <= z_storage*pmax, base_name=name[1]) + c2 = JuMP.@constraint(pm.model, ps >= z_storage*pmin, base_name=name[2]) + c3 = JuMP.@constraint(pm.model, qs <= z_storage*qmax, base_name=name[3]) + c4 = JuMP.@constraint(pm.model, qs >= z_storage*qmin, base_name=name[4]) + c5 = JuMP.@constraint(pm.model, qsc <= z_storage*qmax, base_name=name[5]) + c6 = JuMP.@constraint(pm.model, qsc >= z_storage*qmin, base_name=name[6]) + pm.model[Symbol(name[1])] = c1 + pm.model[Symbol(name[2])] = c2 + pm.model[Symbol(name[3])] = c3 + pm.model[Symbol(name[4])] = c4 + pm.model[Symbol(name[5])] = c5 + pm.model[Symbol(name[6])] = c6 +end \ No newline at end of file From a50626eead1ea665800279f7eb6f00439073b631 Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 5 Feb 2025 16:14:21 -0300 Subject: [PATCH 3/4] fixing an error --- .vscode/settings.json | 3 --- src/core/constraint.jl | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index fe58ee881..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "julia.environmentPath": "c:\\Users\\André\\OneDrive\\Área de Trabalho\\PowerModels.jl" -} \ No newline at end of file diff --git a/src/core/constraint.jl b/src/core/constraint.jl index 8b439b9c4..21a2d9b07 100644 --- a/src/core/constraint.jl +++ b/src/core/constraint.jl @@ -208,6 +208,9 @@ function constraint_switch_power_on_off(pm::AbstractPowerModel, n::Int, i, f_idx qsw = var(pm, n, :qsw, f_idx) z = var(pm, n, :z_switch, i) + psw_lb, psw_ub = _IM.variable_domain(psw) + qsw_lb, qsw_ub = _IM.variable_domain(qsw) + c1 = JuMP.@constraint(pm.model, psw <= psw_ub*z, base_name=name[1]) c2 = JuMP.@constraint(pm.model, psw >= psw_lb*z, base_name=name[2]) c3 = JuMP.@constraint(pm.model, qsw <= qsw_ub*z, base_name=name[3]) From 0d46f96e9830a50554aea37e5659f1abe5274158 Mon Sep 17 00:00:00 2001 From: Andre Date: Fri, 7 Feb 2025 15:25:34 -0300 Subject: [PATCH 4/4] fix line endings --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6da2c1c9b..1874fb591 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,4 @@ docs/build/ docs/site/ docs/.documenter .project -.tags \ No newline at end of file +.tags