ModelingToolkit.jl icon indicating copy to clipboard operation
ModelingToolkit.jl copied to clipboard

Problem when defining Vector variables in connectors

Open traversaro opened this issue 3 years ago • 2 comments

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.

traversaro avatar Jan 23 '22 14:01 traversaro

Most things with array variables are not supported right now. There's very limited support for array variables, but it will improve over time.

ChrisRackauckas avatar Jan 23 '22 16:01 ChrisRackauckas

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)

YingboMa avatar May 14 '22 00:05 YingboMa

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):

AayushSabharwal avatar Apr 04 '24 12:04 AayushSabharwal

Great, thanks!

traversaro avatar Apr 04 '24 12:04 traversaro