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

Structural simplification fails on non-1-indexed variable array

Open hersle opened this issue 1 year ago • 0 comments

The example

using ModelingToolkit
using ModelingToolkit: t_nounits as t, D_nounits as D

@testset "Non-1-indexed variable array" begin
    @variables x(t)[0:1] # 0-indexed variable array
    sys = ODESystem([
        x[0] ~ 0.0
        D(x[1]) ~ x[0]
    ], t, [x], []; name=:sys)
    @test_nowarn sys = structural_simplify(sys)
    @test equations(sys) == [D(x[1]) ~ 0.0]
end

fails because this hack tries to access the 1-indexed vector [x[0], x[1]] at index [0]:

  BoundsError: attempt to access 2-element Vector{SymbolicUtils.BasicSymbolic{Real}} at index [0]
  Stacktrace:
    [1] getindex(A::Vector{SymbolicUtils.BasicSymbolic{Real}}, i1::Int64)
      @ Base .\essentials.jl:13
    [2] fast_substitute(expr::SymbolicUtils.BasicSymbolic{Real},
 subs::Dict{Any, Any}; operator::Type)
      @ Symbolics C:\Users\herma\.julia\packages\Symbolics\Eas9m\src\variable.jl:489
    [3] fast_substitute(eq::Equation, subs::Dict{Any, Any}; operator::Type)
      @ Symbolics C:\Users\herma\.julia\packages\Symbolics\Eas9m\src\variable.jl:455
    [4] tearing_reassemble(state::TearingState{ODESystem}, var_eq_matching::ModelingToolkit.BipartiteGraphs.Matching{Union{ModelingToolkit.BipartiteGraphs.Unassigned, ModelingToolkit.StructuralTransformations.SelectedState}, Vector{Union{ModelingToolkit.BipartiteGraphs.Unassigned, ModelingToolkit.StructuralTransformations.SelectedState, Int64}}}, full_var_eq_matching::Nothing; simplify::Bool, mm::ModelingToolkit.SparseMatrixCLIL{Int64, Int64}) 
      @ ModelingToolkit.StructuralTransformations C:\Users\herma\.julia\packages\ModelingToolkit\kByuD\src\structural_transformation\symbolics_tearing.jl:582
    [5] tearing_reassemble (repeats 2 times)
      @ C:\Users\herma\.julia\packages\ModelingToolkit\kByuD\src\structural_transformation\symbolics_tearing.jl:220 [inlined]   
    [6] #dummy_derivative#128
      @ C:\Users\herma\.julia\packages\ModelingToolkit\kByuD\src\structural_transformation\symbolics_tearing.jl:675 [inlined]   
    [7] _structural_simplify!(state::TearingState{ODESystem}, io::Nothing; simplify::Bool, check_consistency::Bool, fully_determined::Bool, warn_initialize_determined::Bool, dummy_derivative::Bool, kwargs::@Kwargs{})
      @ ModelingToolkit C:\Users\herma\.julia\packages\ModelingToolkit\kByuD\src\systems\systemstructure.jl:692
    [8] _structural_simplify!
      @ C:\Users\herma\.julia\packages\ModelingToolkit\kByuD\src\systems\systemstructure.jl:672 [inlined]
    [9] structural_simplify!(state::TearingState{ODESystem}, io::Nothing; simplify::Bool, check_consistency::Bool, fully_determined::Bool, warn_initialize_determined::Bool, kwargs::@Kwargs{}) 
      @ ModelingToolkit C:\Users\herma\.julia\packages\ModelingToolkit\kByuD\src\systems\systemstructure.jl:635
    ...

hersle avatar Apr 25 '24 15:04 hersle