ModelingToolkit.jl
ModelingToolkit.jl copied to clipboard
Problem when defining Vector variables in connectors
Hello everyone! I am trying to extend some acausal components examples by defining a connector that contains a vector variable. In particular, with this example:
using ModelingToolkit, Plots, DifferentialEquations
@variables t
@connector function VectorConnector(;name, N = 10)
sts = @variables u[1:N](t)
ODESystem(Equation[], t, sts, []; name=name)
end
function VectorConstant(;name, N = 10)
@named output = VectorConnector(N=N)
compose(ODESystem(Equation[], t, [], []; name=name), output)
end
N = 10
@named constant = VectorConstant(N = N)
and this environment:
(@v1.7) pkg> st
Status `~/.julia/environments/v1.7/Project.toml`
[0c46a032] DifferentialEquations v7.1.0
[961ee093] ModelingToolkit v8.3.2
[91a5bcdd] Plots v1.25.6
it fails with error:
ERROR: LoadError: MethodError: no method matching hasmetadata(::Vector{Num}, ::Type{Symbolics.VariableDefaultValue})
Closest candidates are:
hasmetadata(::SymbolicUtils.Symbolic, ::Any) at ~/.julia/packages/SymbolicUtils/FvmiV/src/types.jl:15
hasmetadata(::Complex{Num}, ::Any) at ~/.julia/packages/Symbolics/HDE84/src/Symbolics.jl:147
hasmetadata(::Num, ::Any) at ~/.julia/packages/Symbolics/HDE84/src/Symbolics.jl:147
Stacktrace:
[1] hasdefault(v::Vector{Num})
@ ModelingToolkit ~/.julia/packages/ModelingToolkit/KItSa/src/utils.jl:190
[2] collect_defaults!
@ ~/.julia/packages/ModelingToolkit/KItSa/src/utils.jl:201 [inlined]
[3] process_variables!(var_to_name::Dict{Any, Any}, defs::Dict{Any, Any}, vars::Vector{Vector{Num}})
@ ModelingToolkit ~/.julia/packages/ModelingToolkit/KItSa/src/utils.jl:195
[4] ODESystem(deqs::Vector{Equation}, iv::Num, dvs::Vector{Symbolics.Arr{Num, 1}}, ps::Vector{Any}; controls::Vector{Num}, observed::Vector{Equation}, systems::Vector{ODESystem}, name::Symbol, default_u0::Dict{Any, Any}, default_p::Dict{Any, Any}, defaults::Dict{Any, Any}, connector_type::Nothing, preface::Nothing, continuous_events::Nothing, checks::Bool)
@ ModelingToolkit ~/.julia/packages/ModelingToolkit/KItSa/src/systems/diffeqs/odesystem.jl:146
[5] macro expansion
@ ~/jltest/vector_connector2.jl:7 [inlined]
[6] (::var"#f#5"{Symbol, Int64})()
@ Main ~/.julia/packages/ModelingToolkit/KItSa/src/systems/connectors.jl:17
[7] VectorConnector(; name::Symbol, N::Int64)
@ Main ~/.julia/packages/ModelingToolkit/KItSa/src/systems/connectors.jl:19
[8] VectorConstant(; name::Symbol, N::Int64)
@ Main ~/jltest/vector_connector2.jl:11
[9] top-level scope
@ ~/jltest/vector_connector2.jl:16
[10] include(fname::String)
@ Base.MainInclude ./client.jl:451
[11] top-level scope
@ REPL[2]:1
in expression starting at /home/traversaro/jltest/vector_connector2.jl:16
As I did not find any example with a connector that contains a vector variable this could be an expected failure as it is not supported, but I do not have enough experience in ModelingToolkit.jl to understand if this is the case.
Most things with array variables are not supported right now. There's very limited support for array variables, but it will improve over time.
It should be
julia> @connector function VectorConnector(;name, N = 10)
sts = @variables u[1:N](t)
ODESystem(Equation[], t, mapreduce(collect, vcat, sts), []; name=name)
end
VectorConnector (generic function with 1 method)
This works now
julia> @connector function VectorConnector(;name, N = 10)
sts = @variables u(t)[1:N]
ODESystem(Equation[], t, sts, []; name=name)
end
julia> function VectorConstant(;name, N = 10)
@named output = VectorConnector(N=N)
compose(ODESystem(Equation[], t, [], []; name=name), output)
end
julia> N = 10
julia> @named constant = VectorConstant(N = N)
┌ Warning: output contains 0 flow variables, yet 1 regular (non-flow, non-stream, non-input, non-output) variables. This could lead to imbalanced model that are difficult to debug. Consider marking some of the regular variables as input/output variables.
└ @ ModelingToolkit ~/Julia/SciML/ModelingToolkit.jl/src/systems/connectors.jl:54
Model constant with 0 equations
Unknowns (1):
output₊u(t)
Parameters (0):
Great, thanks!