Skip to content
This repository was archived by the owner on Jun 21, 2024. It is now read-only.
This repository was archived by the owner on Jun 21, 2024. It is now read-only.

interactive_evolution's idxs parameter doesn't behave as expected #96

@perryprog

Description

@perryprog

When using interactive_evolution (and possibly other function that support idxs; I haven't tested them), the idxs parameter doesn't seem to behave correctly. When using DynamicalSystem's double pendulum system (param order is [θ₁,ω₁,θ₂,ω₂]) and attempting to graph both theta values, this is what I get:

julia> using GLMakie, DynamicalSystems, InteractiveDynamics

julia> ds = Systems.double_pendulum()
4-dimensional continuous dynamical system
 state:       [1.5708, 0.0, 0.0, 0.5]
 rule f:      doublependulum_rule
 in-place?    false
 jacobian:    ForwardDiff
 parameters:  [10.0, 1.0, 1.0, 1.0, 1.0]

julia> interactive_evolution(ds; idxs = [1, 3]);

juila> # Click "Step" ("run" does nothing):
Error in callback:
BoundsError: attempt to access Tuple{Float64, Float64} at index [3]
Stacktrace
Stacktrace:
  [1] getindex
    @ ./tuple.jl:29 [inlined]
  [2] getindex
    @ ~/.julia/packages/StaticArrays/6D1fn/src/SArray.jl:94 [inlined]
  [3] (::InteractiveDynamics.var"#69#77"{typeof(identity), SVector{2, Int64}, Vector{Int64}, Int64, Observable{Vector{Point{2, Float32}}}, Vector{Observable}, SimpleDiffEq.SimpleATsit5Integrator{true, Vector{SVector{4, Float64}}, Float64, Vector{Float64}, SciMLBase.ODEFunction{true, DynamicalSystemsBase.var"#30#32"{ContinuousDynamicalSystem{false, SVector{4, Float64}, 4, typeof(DynamicalSystemsBase.Systems.doublependulum_rule), Vector{Float64}, DynamicalSystemsBase.var"#9#15"{typeof(DynamicalSystemsBase.Systems.doublependulum_rule)}, SMatrix{4, 4, Float64, 16}, true}, Int64}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, typeof(DynamicalSystemsBase._parallelnorm)}, Int64})(clicks::Int64)
    @ InteractiveDynamics ~/.julia/packages/InteractiveDynamics/NHT8Y/src/chaos/trajanim.jl:175
  [4] #invokelatest#2
    @ ./essentials.jl:716 [inlined]
  [5] invokelatest
    @ ./essentials.jl:714 [inlined]
  [6] notify
    @ ~/.julia/packages/Observables/OFj0u/src/Observables.jl:88 [inlined]
  [7] setindex!(observable::Observable{Any}, val::Int64)
    @ Observables ~/.julia/packages/Observables/OFj0u/src/Observables.jl:248
  [8] (::Makie.MakieLayout.var"#615#625"{Observable{Symbol}, Observable{Any}})(#unused#::MouseEvent)
    @ Makie.MakieLayout ~/.julia/packages/Makie/lgPZh/src/makielayout/layoutables/button.jl:87
  [9] (::Makie.MakieLayout.var"#30#31"{Makie.MakieLayout.var"#615#625"{Observable{Symbol}, Observable{Any}}})(event::MouseEvent)
    @ Makie.MakieLayout ~/.julia/packages/Makie/lgPZh/src/makielayout/mousestatemachine.jl:86
 [10] #invokelatest#2
    @ ./essentials.jl:716 [inlined]
 [11] invokelatest
    @ ./essentials.jl:714 [inlined]
 [12] (::Makie.PrioCallback)(val::MouseEvent)
    @ Makie ~/.julia/packages/Makie/lgPZh/src/interaction/PriorityObservable.jl:16
 [13] #invokelatest#2
    @ ./essentials.jl:716 [inlined]
 [14] invokelatest
    @ ./essentials.jl:714 [inlined]
 [15] notify(observable::Makie.PriorityObservable{MouseEvent})
    @ Makie ~/.julia/packages/Makie/lgPZh/src/interaction/PriorityObservable.jl:84
 [16] setindex!
    @ ~/.julia/packages/Makie/lgPZh/src/interaction/PriorityObservable.jl:78 [inlined]
 [17] (::Makie.MakieLayout.var"#100#102"{Scene, Base.RefValue{Bool}, Base.RefValue{Union{Nothing, Makie.Mouse.Button}}, Base.RefValue{Float64}, Base.RefValue{Float64}, Base.RefValue{Bool}, Base.RefValue{Bool}, Base.RefValue{Union{Nothing, Makie.Mouse.Button}}, Base.RefValue{Bool}, Base.RefValue{Point{2, Float32}}, Base.RefValue{Point{2, Float32}}, Base.RefValue{Makie.Mouse.Action}, Makie.PriorityObservable{MouseEvent}, Float64, Module})(event::Makie.MouseButtonEvent)
    @ Makie.MakieLayout ~/.julia/packages/Makie/lgPZh/src/makielayout/mousestatemachine.jl:259
 [18] #invokelatest#2
    @ ./essentials.jl:716 [inlined]
 [19] invokelatest
    @ ./essentials.jl:714 [inlined]
 [20] (::Makie.PrioCallback)(val::Makie.MouseButtonEvent)
    @ Makie ~/.julia/packages/Makie/lgPZh/src/interaction/PriorityObservable.jl:16
 [21] #invokelatest#2
    @ ./essentials.jl:716 [inlined]
 [22] invokelatest
    @ ./essentials.jl:714 [inlined]
 [23] notify(observable::Makie.PriorityObservable{Makie.MouseButtonEvent})
    @ Makie ~/.julia/packages/Makie/lgPZh/src/interaction/PriorityObservable.jl:84
 [24] setindex!
    @ ~/.julia/packages/Makie/lgPZh/src/interaction/PriorityObservable.jl:78 [inlined]
 [25] (::GLMakie.var"#mousebuttons#78"{Makie.PriorityObservable{Makie.MouseButtonEvent}})(window::GLFW.Window, button::GLFW.MouseButton, action::GLFW.Action, mods::Int32)
    @ GLMakie ~/.julia/packages/GLMakie/TfSB1/src/events.jl:89
 [26] _MouseButtonCallbackWrapper(window::GLFW.Window, button::GLFW.MouseButton, action::GLFW.Action, mods::Int32)
    @ GLFW ~/.julia/packages/GLFW/BWxfF/src/callback.jl:43
 [27] PollEvents
    @ ~/.julia/packages/GLFW/BWxfF/src/glfw3.jl:620 [inlined]
 [28] pollevents
    @ ~/.julia/packages/GLMakie/TfSB1/src/screen.jl:545 [inlined]
 [29] fps_renderloop(screen::GLMakie.Screen, framerate::Float64)
    @ GLMakie ~/.julia/packages/GLMakie/TfSB1/src/rendering.jl:21
 [30] renderloop(screen::GLMakie.Screen; framerate::Float64)
    @ GLMakie ~/.julia/packages/GLMakie/TfSB1/src/rendering.jl:48
 [31] renderloop(screen::GLMakie.Screen)
    @ GLMakie ~/.julia/packages/GLMakie/TfSB1/src/rendering.jl:41
 [32] (::GLMakie.var"#56#58"{GLMakie.Screen})()
    @ GLMakie ./task.jl:429

If I attempt to use a tuple for idxs instead, as sometimes suggested by the documentation (I assume either an Array or a Tuple is supposed to be fine), I get this type error:

julia> interactive_evolution(ds; idxs = (1, 3))
ERROR: ArgumentError: invalid index: (1, 3) of type Tuple{Int64, Int64}
Stacktrace:
 [1] to_index(i::Tuple{Int64, Int64})
   @ Base ./indices.jl:300
 [2] to_index(A::SVector{4, Float64}, i::Tuple{Int64, Int64})
   @ Base ./indices.jl:277
 [3] to_indices
   @ ./indices.jl:333 [inlined]
 [4] to_indices
   @ ./indices.jl:325 [inlined]
 [5] getindex
   @ ./abstractarray.jl:1218 [inlined]
 [6] _init_timeseries_plots!(layout::GridLayout, pinteg::SimpleDiffEq.SimpleATsit5Integrator{true, Vector{SVector{4, Float64}}, Float64, Vector{Float64}, SciMLBase.ODEFunction{true, DynamicalSystemsBase.var"#30#32"{ContinuousDynamicalSystem{false, SVector{4, Float64}, 4, typeof(DynamicalSystemsBase.Systems.doublependulum_rule), Vector{Float64}, DynamicalSystemsBase.var"#9#15"{typeof(DynamicalSystemsBase.Systems.doublependulum_rule)}, SMatrix{4, 4, Float64, 16}, true}, Int64}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, typeof(DynamicalSystemsBase._parallelnorm)}, idxs::Tuple{Int64, Int64}, colors::Vector{ColorTypes.RGBA{Float32}}, linekwargs::NamedTuple{(:linewidth,), Tuple{Int64}}, transform::typeof(identity), tail::Int64, lims::Tuple{Tuple{Float64, Float64}, Tuple{Float64, Float64}})
   @ InteractiveDynamics ~/.julia/packages/InteractiveDynamics/NHT8Y/src/chaos/trajanim.jl:283
 [7] interactive_evolution(ds::ContinuousDynamicalSystem{false, SVector{4, Float64}, 4, typeof(DynamicalSystemsBase.Systems.doublependulum_rule), Vector{Float64}, DynamicalSystemsBase.var"#9#15"{typeof(DynamicalSystemsBase.Systems.doublependulum_rule)}, SMatrix{4, 4, Float64, 16}, true}, u0s::Vector{SVector{4, Float64}}; transform::typeof(identity), idxs::Tuple{Int64, Int64}, tsidxs::Tuple{Int64, Int64}, colors::Vector{ColorTypes.RGBA{Float32}}, tail::Int64, lims::Nothing, diffeq::NamedTuple{(), Tuple{}}, plotkwargs::NamedTuple{(), Tuple{}}, m::Float64, total_span::Int64, linekwargs::NamedTuple{(:linewidth,), Tuple{Int64}}, ps::Nothing, pnames::Nothing, add_controls::Bool, steps_per_update::Int64, figure::NamedTuple{(:resolution,), Tuple{Tuple{Int64, Int64}}}, axis::NamedTuple{(), Tuple{}}, fade::Bool)
   @ InteractiveDynamics ~/.julia/packages/InteractiveDynamics/NHT8Y/src/chaos/trajanim.jl:134
 [8] top-level scope
   @ REPL[9]:1

Versions:

  [61744808] DynamicalSystems v2.3.0
  [e9467ef8] GLMakie v0.5.5
  [ec714cd0] InteractiveDynamics v0.21.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions