From cf8b3a3ea6785d769d44ca776286876e2acb2600 Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Fri, 28 Feb 2025 15:52:00 +0530 Subject: [PATCH 1/4] fix: handle symbolic values for parameters passed to `linearize` --- src/linearization.jl | 5 ++++- test/downstream/linearize.jl | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/linearization.jl b/src/linearization.jl index 411620e8f3..70ae5360a8 100644 --- a/src/linearization.jl +++ b/src/linearization.jl @@ -590,9 +590,12 @@ function linearize(sys, lin_fun::LinearizationFunction; t = 0.0, p = DiffEqBase.NullParameters()) prob = LinearizationProblem(lin_fun, t) op = anydict(op) - evaluate_varmap!(op, unknowns(sys)) + evaluate_varmap!(op, keys(op)) for (k, v) in op v === nothing && continue + if symbolic_type(v) != NotSymbolic() || is_array_of_symbolics(v) + v = getu(prob, v)(prob) + end if is_parameter(prob, Initial(k)) setu(prob, Initial(k))(prob, v) else diff --git a/test/downstream/linearize.jl b/test/downstream/linearize.jl index 898040fb4f..fbae0656f9 100644 --- a/test/downstream/linearize.jl +++ b/test/downstream/linearize.jl @@ -329,3 +329,11 @@ end sys, [x], []; op = Dict(x => 1.0), guesses = Dict(y => 1.0), allow_input_derivatives = true) end + +@testset "Symbolic values for parameters in `linearize`" begin + @named tank_noi = Tank_noi() + @unpack md_i, h, m, ρ, A, K = tank_noi + m_ss = 2.4000000003229878 + @test_nowarn linearize( + tank_noi, [md_i], [h]; op = Dict(m => m_ss, md_i => 2, ρ => A / K, A => 5)) +end From 0cf9aadcd7c8330bc7f429a0e09f6a1de5ee8eac Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Fri, 28 Feb 2025 16:42:23 +0530 Subject: [PATCH 2/4] fix: warn if the operating point given to `linearization_function` is empty. --- src/linearization.jl | 4 ++++ test/downstream/linearize.jl | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/linearization.jl b/src/linearization.jl index 70ae5360a8..501582f188 100644 --- a/src/linearization.jl +++ b/src/linearization.jl @@ -42,8 +42,12 @@ function linearization_function(sys::AbstractSystem, inputs, eval_expression = false, eval_module = @__MODULE__, warn_initialize_determined = true, guesses = Dict(), + warn_empty_op = true, kwargs...) op = Dict(op) + if isempty(op) + @warn "An empty operating point was passed to `linearization_function`. An operating point containing the variables that will be changed in `linearize` should be provided. Disable this warning by passing `warn_empty_op = false`." + end inputs isa AbstractVector || (inputs = [inputs]) outputs isa AbstractVector || (outputs = [outputs]) inputs = mapreduce(vcat, inputs; init = []) do var diff --git a/test/downstream/linearize.jl b/test/downstream/linearize.jl index fbae0656f9..704964daae 100644 --- a/test/downstream/linearize.jl +++ b/test/downstream/linearize.jl @@ -337,3 +337,11 @@ end @test_nowarn linearize( tank_noi, [md_i], [h]; op = Dict(m => m_ss, md_i => 2, ρ => A / K, A => 5)) end + +@testset "Warn on empty operating point" begin + @named tank_noi = Tank_noi() + @unpack md_i, h, m = tank_noi + m_ss = 2.4000000003229878 + @test_warn ["empty operating point", "warn_empty_op"] linearize( + tank_noi, [md_i], [h]; p = [md_i => 1.0]) +end From 89dec69df33b4b404613b4226eaa8c599e9f2611 Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Fri, 7 Mar 2025 14:06:31 +0530 Subject: [PATCH 3/4] test: fix warning in `@test_nowarn` --- test/downstream/linearize.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/downstream/linearize.jl b/test/downstream/linearize.jl index 704964daae..0336709173 100644 --- a/test/downstream/linearize.jl +++ b/test/downstream/linearize.jl @@ -262,7 +262,7 @@ closed_loop = ODESystem(connections, t, systems = [model, pid, filt, sensor, r, filt.xd => 0.0 ]) -@test_nowarn linearize(closed_loop, :r, :y) +@test_nowarn linearize(closed_loop, :r, :y; warn_empty_op = false) # https://discourse.julialang.org/t/mtk-change-in-linearize/115760/3 @mtkmodel Tank_noi begin From c354feba39892aaef06ec84c3385ded1b07b2ec7 Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Thu, 13 Mar 2025 16:34:53 +0530 Subject: [PATCH 4/4] fix: respect `warn_empty_op` --- src/linearization.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linearization.jl b/src/linearization.jl index 501582f188..f58f3b4253 100644 --- a/src/linearization.jl +++ b/src/linearization.jl @@ -45,7 +45,7 @@ function linearization_function(sys::AbstractSystem, inputs, warn_empty_op = true, kwargs...) op = Dict(op) - if isempty(op) + if isempty(op) && warn_empty_op @warn "An empty operating point was passed to `linearization_function`. An operating point containing the variables that will be changed in `linearize` should be provided. Disable this warning by passing `warn_empty_op = false`." end inputs isa AbstractVector || (inputs = [inputs])