diff --git a/src/systems/abstractsystem.jl b/src/systems/abstractsystem.jl index 3da5201039..ab632daf34 100644 --- a/src/systems/abstractsystem.jl +++ b/src/systems/abstractsystem.jl @@ -1330,11 +1330,17 @@ 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. +- `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 [] @@ -1343,12 +1349,15 @@ function parameters(sys::AbstractSystem; initial_parameters = false) ps = first.(ps) end systems = get_systems(sys) - result = unique(isempty(systems) ? ps : - [ps; reduce(vcat, namespace_parameters.(systems))]) + 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) @@ -1387,8 +1396,15 @@ 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)) + return parameters(sys; initial_parameters = true, dependent_parameters = true) end """ 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