Hey all, I have a continuous, periodic space ABM. My ABM declaration looks like this:
space2d = ContinuousSpace(extent;
periodic=true,
);
model = AgentBasedModel(Particle, space2d;
agent_step! = agent_step!,
model_step! = (args...) -> (@timeit to "model_step!" model_step!(args...; to=to)),
properties=Dict(:attraction_matrix => properties, :time_scale => 1.0, :hitbox => 1.0, :viscosity => 0.9, :max_distance => 80.0)
)
However running this for a sufficient amount of steps results in this error:
Error in callback:
position is outside space extent!
Stacktrace:
[1] error(s::String)
@ Base ./error.jl:44
[2] move_agent!(agent::Main.ParticleLife.Particle, pos::StaticArraysCore.SVector{2, Float64}, model::Agents.StandardABM{Agents.ContinuousSpace{2, true, Float64, typeof(Agents.no_vel_update)}, Main.ParticleLife.Particle, Dict{Int64, Main.ParticleLife.Particle}, Tuple{DataType}, typeof(Main.ParticleLife.agent_step!), Main.ParticleLife.var"#make_model##0#make_model##1"{TimerOutputs.TimerOutput}, typeof(Agents.Schedulers.fastest), Dict{Symbol, Any}, Random.TaskLocalRNG})
@ Agents ~/.julia/packages/Agents/WuWeG/src/spaces/continuous.jl:153
[3] walk!(agent::Main.ParticleLife.Particle, direction::StaticArraysCore.SVector{2, Float64}, model::Agents.StandardABM{Agents.ContinuousSpace{2, true, Float64, typeof(Agents.no_vel_update)}, Main.ParticleLife.Particle, Dict{Int64, Main.ParticleLife.Particle}, Tuple{DataType}, typeof(Main.ParticleLife.agent_step!), Main.ParticleLife.var"#make_model##0#make_model##1"{TimerOutputs.TimerOutput}, typeof(Agents.Schedulers.fastest), Dict{Symbol, Any}, Random.TaskLocalRNG})
@ Agents ~/.julia/packages/Agents/WuWeG/src/spaces/walk.jl:64
[4] move_agent!(agent::Main.ParticleLife.Particle, model::Agents.StandardABM{Agents.ContinuousSpace{2, true, Float64, typeof(Agents.no_vel_update)}, Main.ParticleLife.Particle, Dict{Int64, Main.ParticleLife.Particle}, Tuple{DataType}, typeof(Main.ParticleLife.agent_step!), Main.ParticleLife.var"#make_model##0#make_model##1"{TimerOutputs.TimerOutput}, typeof(Agents.Schedulers.fastest), Dict{Symbol, Any}, Random.TaskLocalRNG}, dt::Float64)
@ Agents ~/.julia/packages/Agents/WuWeG/src/spaces/continuous.jl:187
[5] agent_step!(agent::Main.ParticleLife.Particle, model::Agents.StandardABM{Agents.ContinuousSpace{2, true, Float64, typeof(Agents.no_vel_update)}, Main.ParticleLife.Particle, Dict{Int64, Main.ParticleLife.Particle}, Tuple{DataType}, typeof(Main.ParticleLife.agent_step!), Main.ParticleLife.var"#make_model##0#make_model##1"{TimerOutputs.TimerOutput}, typeof(Agents.Schedulers.fastest), Dict{Symbol, Any}, Random.TaskLocalRNG})
@ Main.ParticleLife ~/Documents/Programming/particle-life/particle.jl:115
[6] step_ahead!(model::Agents.StandardABM{Agents.ContinuousSpace{2, true, Float64, typeof(Agents.no_vel_update)}, Main.ParticleLife.Particle, Dict{Int64, Main.ParticleLife.Particle}, Tuple{DataType}, typeof(Main.ParticleLife.agent_step!), Main.ParticleLife.var"#make_model##0#make_model##1"{TimerOutputs.TimerOutput}, typeof(Agents.Schedulers.fastest), Dict{Symbol, Any}, Random.TaskLocalRNG}, agent_step!::typeof(Main.ParticleLife.agent_step!), model_step!::Main.ParticleLife.var"#make_model##0#make_model##1"{TimerOutputs.TimerOutput}, n::Int64, t::Base.RefValue{Int64})
@ Agents ~/.julia/packages/Agents/WuWeG/src/simulations/step_standard.jl:17
[7] step!
@ ~/.julia/packages/Agents/WuWeG/src/simulations/step_standard.jl:5 [inlined]
[8] step!(abmobs::Agents.ABMObservable{Observables.Observable{Agents.StandardABM{Agents.ContinuousSpace{2, true, Float64, typeof(Agents.no_vel_update)}, Main.ParticleLife.Particle, Dict{Int64, Main.ParticleLife.Particle}, Tuple{DataType}, typeof(Main.ParticleLife.agent_step!), Main.ParticleLife.var"#make_model##0#make_model##1"{TimerOutputs.TimerOutput}, typeof(Agents.Schedulers.fastest), Dict{Symbol, Any}, Random.TaskLocalRNG}}, Nothing, Nothing, Nothing, Nothing, Bool, Observables.Observable{Int64}, Observables.Observable{Tuple{Base.RefValue{Int64}, Vector{Int64}}}}, t::Int64)
@ AgentsVisualizations ~/.julia/packages/Agents/WuWeG/ext/AgentsVisualizations/src/model_observable.jl:37
[9] (::AgentsVisualizations.var"#add_controls!##2#add_controls!##3"{Agents.ABMObservable{Observables.Observable{Agents.StandardABM{Agents.ContinuousSpace{2, true, Float64, typeof(Agents.no_vel_update)}, Main.ParticleLife.Particle, Dict{Int64, Main.ParticleLife.Particle}, Tuple{DataType}, typeof(Main.ParticleLife.agent_step!), Main.ParticleLife.var"#make_model##0#make_model##1"{TimerOutputs.TimerOutput}, typeof(Agents.Schedulers.fastest), Dict{Symbol, Any}, Random.TaskLocalRNG}}, Nothing, Nothing, Nothing, Nothing, Bool, Observables.Observable{Int64}, Observables.Observable{Tuple{Base.RefValue{Int64}, Vector{Int64}}}}, Observables.Observable{Any}})(c::Int64)
@ AgentsVisualizations ~/.julia/packages/Agents/WuWeG/ext/AgentsVisualizations/src/interaction.jl:47
[10] notify
@ ~/.julia/packages/Observables/YdEbO/src/Observables.jl:206 [inlined]
[11] setindex!(observable::Observables.Observable, val::Any)
@ Observables ~/.julia/packages/Observables/YdEbO/src/Observables.jl:123
[12] (::Makie.var"#initialize_block!##179#initialize_block!##180"{Makie.Button})(::Makie.MouseEvent)
@ Makie ~/.julia/packages/Makie/FUAHr/src/makielayout/blocks/button.jl:72
[13] (::Makie.var"#1313#1314"{Makie.var"#initialize_block!##179#initialize_block!##180"{Makie.Button}})(event::Makie.MouseEvent)
@ Makie ~/.julia/packages/Makie/FUAHr/src/makielayout/mousestatemachine.jl:94
[14] notify
@ ~/.julia/packages/Observables/YdEbO/src/Observables.jl:206 [inlined]
[15] setindex!
@ ~/.julia/packages/Observables/YdEbO/src/Observables.jl:123 [inlined]
[16] (::Makie.var"#_addmouseevents!##2#_addmouseevents!##3"{Makie.Scene, Base.RefValue{Bool}, Base.RefValue{Union{Nothing, Makie.Mouse.Button}}, Base.RefValue{Float64}, Base.RefValue{Float64}, Base.RefValue{Bool}, Base.RefValue{GeometryBasics.Point{2, Float64}}, Base.RefValue{Bool}, Base.RefValue{Union{Nothing, Makie.Mouse.Button}}, Base.RefValue{Bool}, Base.RefValue{GeometryBasics.Point{2, Float32}}, Base.RefValue{GeometryBasics.Point{2, Float64}}, Base.RefValue{Makie.Mouse.Action}, Observables.Observable{Makie.MouseEvent}, Float64, Module})(event::Makie.MouseButtonEvent)
@ Makie ~/.julia/packages/Makie/FUAHr/src/makielayout/mousestatemachine.jl:365
[17] notify
@ ~/.julia/packages/Observables/YdEbO/src/Observables.jl:206 [inlined]
[18] setindex!
@ ~/.julia/packages/Observables/YdEbO/src/Observables.jl:123 [inlined]
[19] (::GLMakie.var"#mousebuttons#mousebuttons##0"{Observables.Observable{Makie.MouseButtonEvent}})(window::GLFW.Window, button::GLFW.MouseButton, action::GLFW.Action, mods::Int32)
@ GLMakie ~/.julia/packages/GLMakie/1dQSN/src/events.jl:104
[20] _MouseButtonCallbackWrapper(window::GLFW.Window, button::GLFW.MouseButton, action::GLFW.Action, mods::Int32)
@ GLFW ~/.julia/packages/GLFW/Zwulj/src/callback.jl:46
[21] macro expansion
@ ~/.julia/packages/GLFW/Zwulj/src/GLFW.jl:34 [inlined]
[22] PollEvents
@ ~/.julia/packages/GLFW/Zwulj/src/glfw3.jl:753 [inlined]
[23] pollevents(screen::GLMakie.Screen{GLFW.Window}, frame_state::Makie.TickState)
@ GLMakie ~/.julia/packages/GLMakie/1dQSN/src/screen.jl:546
[24] on_demand_renderloop(screen::GLMakie.Screen{GLFW.Window})
@ GLMakie ~/.julia/packages/GLMakie/1dQSN/src/screen.jl:1038
[25] renderloop(screen::GLMakie.Screen{GLFW.Window})
@ GLMakie ~/.julia/packages/GLMakie/1dQSN/src/screen.jl:1066
[26] (::GLMakie.var"#start_renderloop!##0#start_renderloop!##1"{GLMakie.Screen{GLFW.Window}})()
@ GLMakie ~/.julia/packages/GLMakie/1dQSN/src/screen.jl:927
I’m very confused by this. From what I understand, a periodic space lets the agents loop around from one edge to another. I’m pretty sure that this error message, however, is saying that the agent did not loop around, it instead exceeded the space boundaries.
What am I missing?
Thanks in advance!