Skip to content

Commit 9888fca

Browse files
fix: fix handling of loop openings for systems that are nonlinear in the inputs
1 parent dc54976 commit 9888fca

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

src/systems/analysis_points.jl

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -491,14 +491,20 @@ struct Break <: AnalysisPointTransformation
491491
applicable if `add_input == true`.
492492
"""
493493
default_outputs_to_input::Bool
494+
"""
495+
Whether the added input is a parameter. Only applicable if `add_input == true`.
496+
"""
497+
added_input_is_param::Bool
494498
end
495499

496500
"""
497501
$(TYPEDSIGNATURES)
498502
499503
`Break` the given analysis point `ap`.
500504
"""
501-
Break(ap::AnalysisPoint, add_input::Bool = false) = Break(ap, add_input, false)
505+
function Break(ap::AnalysisPoint, add_input::Bool = false, default_outputs_to_input = false)
506+
Break(ap, add_input, default_outputs_to_input, false)
507+
end
502508

503509
function apply_transformation(tf::Break, sys::AbstractSystem)
504510
modify_nested_subsystem(sys, tf.ap) do breaksys
@@ -528,9 +534,15 @@ function apply_transformation(tf::Break, sys::AbstractSystem)
528534
new_def
529535
end
530536
@set! breaksys.defaults = defs
531-
unks = copy(get_unknowns(breaksys))
532-
push!(unks, new_var)
533-
@set! breaksys.unknowns = unks
537+
if tf.added_input_is_param
538+
ps = copy(get_ps(breaksys))
539+
push!(ps, new_var)
540+
@set! breaksys.ps = ps
541+
else
542+
unks = copy(get_unknowns(breaksys))
543+
push!(unks, new_var)
544+
@set! breaksys.unknowns = unks
545+
end
534546

535547
return breaksys, (new_var,)
536548
end
@@ -812,12 +824,7 @@ Given a list of analysis points, break the connection for each and set the outpu
812824
"""
813825
function handle_loop_openings(sys::AbstractSystem, aps)
814826
for ap in canonicalize_ap(sys, aps)
815-
sys, (outvar,) = apply_transformation(Break(ap, true, true), sys)
816-
if Symbolics.isarraysymbolic(outvar)
817-
push!(get_eqs(sys), outvar ~ zeros(size(outvar)))
818-
else
819-
push!(get_eqs(sys), outvar ~ 0)
820-
end
827+
sys, _ = apply_transformation(Break(ap, true, true, true), sys)
821828
end
822829
return sys
823830
end
@@ -849,10 +856,10 @@ All other keyword arguments are forwarded to `linearization_function`.
849856
"""
850857
function get_linear_analysis_function(
851858
sys::AbstractSystem, transform, aps; system_modifier = identity, loop_openings = [], kwargs...)
852-
sys = handle_loop_openings(sys, loop_openings)
853-
aps = canonicalize_ap(sys, aps)
854859
dus = []
855860
us = []
861+
sys = handle_loop_openings(sys, loop_openings)
862+
aps = canonicalize_ap(sys, aps)
856863
for ap in aps
857864
sys, (du, u) = apply_transformation(transform(ap), sys)
858865
push!(dus, du)

0 commit comments

Comments
 (0)