From da392dfb3b94a0431e03d278cc5ae6e587d3b207 Mon Sep 17 00:00:00 2001 From: Herman Sletmoen Date: Thu, 27 Mar 2025 12:02:53 +0100 Subject: [PATCH 1/4] Document parameters and full_parameters --- src/systems/abstractsystem.jl | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/systems/abstractsystem.jl b/src/systems/abstractsystem.jl index 3da5201039..915c55a948 100644 --- a/src/systems/abstractsystem.jl +++ b/src/systems/abstractsystem.jl @@ -1330,9 +1330,13 @@ end """ $(TYPEDSIGNATURES) -Get the parameters of the system `sys` and its subsystems. +Get the standard parameters of the system `sys` and its subsystems. -See also [`@parameters`](@ref) and [`ModelingToolkit.get_ps`](@ref). +# Keyword arguments + +- `initial_parameters`: Whether to include parameters for initial values of variables in the initialization system. + +See also [`full_parameters`](@ref) and [`ModelingToolkit.get_ps`](@ref). """ function parameters(sys::AbstractSystem; initial_parameters = false) ps = get_ps(sys) @@ -1387,6 +1391,13 @@ function parameter_dependencies(sys::AbstractSystem) return vcat(namespaced_deps, pdeps) end +""" +$(TYPEDSIGNATURES) + +Get all parameters of the system `sys` and its subsystems, including initial values and dependent parameters. + +See also [`parameters`](@ref) and [`ModelingToolkit.get_ps`](@ref). +""" function full_parameters(sys::AbstractSystem) vcat(parameters(sys; initial_parameters = true), dependent_parameters(sys)) end From fe9c891401ed2ddcce0f1854c4611ebdb334b658 Mon Sep 17 00:00:00 2001 From: Herman Sletmoen Date: Thu, 27 Mar 2025 12:11:42 +0100 Subject: [PATCH 2/4] Add keyword argument for dependent parameters --- src/systems/abstractsystem.jl | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/systems/abstractsystem.jl b/src/systems/abstractsystem.jl index 915c55a948..a30e32ab93 100644 --- a/src/systems/abstractsystem.jl +++ b/src/systems/abstractsystem.jl @@ -1335,10 +1335,11 @@ Get the standard parameters of the system `sys` and its subsystems. # Keyword arguments - `initial_parameters`: Whether to include parameters for initial values of variables in the initialization system. +- `dependent_parameters`: Whether to include parameters that are determined by parameter dependencies. See also [`full_parameters`](@ref) and [`ModelingToolkit.get_ps`](@ref). """ -function parameters(sys::AbstractSystem; initial_parameters = false) +function parameters(sys::AbstractSystem; initial_parameters = false, dependent_parameters = false) ps = get_ps(sys) if ps == SciMLBase.NullParameters() return [] @@ -1347,12 +1348,15 @@ function parameters(sys::AbstractSystem; initial_parameters = false) ps = first.(ps) end systems = get_systems(sys) - result = unique(isempty(systems) ? ps : + ps = unique(isempty(systems) ? ps : [ps; reduce(vcat, namespace_parameters.(systems))]) if !initial_parameters && !is_initializesystem(sys) - filter!(x -> !iscall(x) || !isa(operation(x), Initial), result) + filter!(x -> !iscall(x) || !isa(operation(x), Initial), ps) end - return result + if dependent_parameters + ps = vcat(ps, ModelingToolkit.dependent_parameters(sys)) + end + return ps end function dependent_parameters(sys::AbstractSystem) @@ -1399,7 +1403,7 @@ Get all parameters of the system `sys` and its subsystems, including initial val See also [`parameters`](@ref) and [`ModelingToolkit.get_ps`](@ref). """ function full_parameters(sys::AbstractSystem) - vcat(parameters(sys; initial_parameters = true), dependent_parameters(sys)) + return parameters(sys; initial_parameters = true, dependent_parameters = true) end """ From 692db1d2ddfa92e357340084d541fe2f0dd3967c Mon Sep 17 00:00:00 2001 From: Herman Sletmoen Date: Thu, 27 Mar 2025 12:18:39 +0100 Subject: [PATCH 3/4] Format --- src/systems/abstractsystem.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/systems/abstractsystem.jl b/src/systems/abstractsystem.jl index a30e32ab93..ab632daf34 100644 --- a/src/systems/abstractsystem.jl +++ b/src/systems/abstractsystem.jl @@ -1339,7 +1339,8 @@ Get the standard parameters of the system `sys` and its subsystems. See also [`full_parameters`](@ref) and [`ModelingToolkit.get_ps`](@ref). """ -function parameters(sys::AbstractSystem; initial_parameters = false, dependent_parameters = false) +function parameters( + sys::AbstractSystem; initial_parameters = false, dependent_parameters = false) ps = get_ps(sys) if ps == SciMLBase.NullParameters() return [] @@ -1349,7 +1350,7 @@ function parameters(sys::AbstractSystem; initial_parameters = false, dependent_p end systems = get_systems(sys) ps = unique(isempty(systems) ? ps : - [ps; reduce(vcat, namespace_parameters.(systems))]) + [ps; reduce(vcat, namespace_parameters.(systems))]) if !initial_parameters && !is_initializesystem(sys) filter!(x -> !iscall(x) || !isa(operation(x), Initial), ps) end From e2cdae4bd9b3da2dc3161f750d0f4ce2862b6718 Mon Sep 17 00:00:00 2001 From: Herman Sletmoen Date: Thu, 27 Mar 2025 16:14:46 +0100 Subject: [PATCH 4/4] Test parameter getter flags --- test/split_parameters.jl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/split_parameters.jl b/test/split_parameters.jl index 74f8d41d73..14cd1ad14c 100644 --- a/test/split_parameters.jl +++ b/test/split_parameters.jl @@ -311,3 +311,20 @@ end @test sysref.subsys.c in ps @test length(ps) == 2 end + +@testset "Parameter getter flags" begin + evalinterp(I, t) = I(t) + @register_symbolic evalinterp(I::LinearInterpolation, t) + + @parameters P1 P2 (C::LinearInterpolation)(..) I::LinearInterpolation + @variables x(t) y(t) + eqs = [D(x) ~ P1 + P2 + C(t) + evalinterp(I, y), y ~ 2 * x] + pdeps = [P1 ~ 2 * P2] + @named M = ODESystem(eqs, t; parameter_dependencies = pdeps) + Ms = structural_simplify(M) + + @test Set(parameters(Ms)) == Set([P2, I, C]) + @test Set(parameters(Ms; initial_parameters = true)) == + Set([P2, I, C, Initial(P1), Initial(x), Initial(y)]) + @test Set(parameters(Ms; dependent_parameters = true)) == Set([P2, I, C, P1]) +end