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

Cannot initialize non-1-indexed array variables

Open hersle opened this issue 6 months ago • 2 comments

Trivial example:

using ModelingToolkit
using ModelingToolkit: t_nounits as t, D_nounits as D
@variables x(t)[0:1]
@named M = ODESystem([D(x[0]) ~ 0, x[1] ~ 1], t)
M = structural_simplify(M)
prob = ODEProblem(M, [x[0] => 1.0], (0.0, 1.0), [])
ERROR: BoundsError: attempt to access SymbolicUtils.BasicSymbolic{AbstractVector{Real}} at index [0]
Stacktrace:
  [1] getindex(x::SymbolicUtils.BasicSymbolic{AbstractVector{Real}}, idx::Int64)
    @ Symbolics ~/.julia/packages/Symbolics/kQzvO/src/array-lib.jl:32
  [2] add_fallbacks!(varmap::Dict{Any, Any}, vars::Vector{SymbolicUtils.BasicSymbolic{Real}}, fallbacks::Dict{Any, Any}; toterm::typeof(ModelingToolkit.default_toterm))
    @ ModelingToolkit ~/.julia/dev/ModelingToolkit/src/systems/problem_utils.jl:163
  [3] add_fallbacks!
    @ ~/.julia/dev/ModelingToolkit/src/systems/problem_utils.jl:117 [inlined]
  [4] build_operating_point!(sys::ODESystem, u0map::Dict{Any, Any}, pmap::Dict{Any, Any}, defs::Dict{Any, Any}, cmap::Vector{Equation}, dvs::Vector{SymbolicUtils.BasicSymbolic{Real}}, ps::Vector{Any})
    @ ModelingToolkit ~/.julia/dev/ModelingToolkit/src/systems/problem_utils.jl:542
  [5] MTKParameters(sys::ODESystem, p::Dict{Any, Any}, u0::Dict{Any, Any}; tofloat::Bool, t0::Nothing, substitution_limit::Int64, floatT::Type, p_constructor::Function)
    @ ModelingToolkit ~/.julia/dev/ModelingToolkit/src/systems/parameter_buffer.jl:53
  [6] MTKParameters
    @ ~/.julia/packages/ModelingToolkit/udKhl/src/systems/parameter_buffer.jl:29 [inlined]
  [7] process_SciMLProblem(constructor::Type, sys::ODESystem, u0map::Vector{…}, pmap::Vector{…}; build_initializeprob::Bool, implicit_dae::Bool, t::Float64, guesses::Dict{…}, warn_initialize_determined::Bool, initialization_eqs::Vector{…}, eval_expression::Bool, eval_module::Module, fully_determined::Nothing, check_initialization_units::Bool, tofloat::Bool, u0_constructor::typeof(identity), p_constructor::typeof(identity), du0map::Nothing, check_length::Bool, symbolic_u0::Bool, warn_cyclic_dependency::Bool, circular_dependency_max_cycle_length::Int64, circular_dependency_max_cycles::Int64, substitution_limit::Int64, use_scc::Bool, force_initialization_time_independent::Bool, algebraic_only::Bool, allow_incomplete::Bool, is_initializeprob::Bool, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/dev/ModelingToolkit/src/systems/problem_utils.jl:1345
  [8] (ODEProblem{…})(sys::ODESystem, u0map::Vector{…}, tspan::Tuple{…}, parammap::Vector{…}; allow_cost::Bool, callback::Nothing, check_length::Bool, warn_initialize_determined::Bool, eval_expression::Bool, eval_module::Module, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/dev/ModelingToolkit/src/systems/diffeqs/abstractodesystem.jl:814
  ...

hersle avatar May 23 '25 14:05 hersle

I think this happens because this val is a

ModelingToolkit.StructuralTransformations.change_origin(CartesianIndex(0,), SymbolicUtils.BasicSymbolic{Real}[(x(t))[0], (x(t))[1]])

This wraps the 0-based array inside a registered 1-indexed array symbolic function. So indexing it at 0 fails.

hersle avatar May 23 '25 14:05 hersle

Is this hack what is supposed to handle the change_origin wrapping?

hersle avatar May 23 '25 14:05 hersle