Need some help/review on ants model

Hi there,

Last year i start to replicate the famous “Ants” model using Agents.jl with version 4.x

The result was not bad, see the video and original repo :

This year, to finish integration of Julia with Agents.jl into OpenMole distributed HPC marketplace examples, i try to update to Agents.jl 5.x

I have some difficulties with evolution of !step method :

In my previous code i use step like this to update my graphics : step!(abmstepper,model, ants_agent_step!, ants_model_step!, 1)

with

fig, abmstepper, abmobs = init_fig(model, observable)

and init_fig running abmplot :

function init_fig(model, observable)

    function ants_marker(b::Ants)
       φ = atan(b.vel[2], b.vel[1]) #+ π/2 + π
       scale(rotate2D(ants_polygon, φ), 2)
    end

    function ants_color(b::Ants)
       return b.color
    end

    fig, abmstepper, abmobs  = abmplot(model; ac=ants_color, am=ants_marker)

    ax, hm = heatmap(fig[1,2], observable[1]; colormap= :thermal, nan_color= :red)
    ax.aspect = AxisAspect(1)

    ax2, hm2 = heatmap(fig[2,1], observable[2]; colormap= :thermal, nan_color= :red)
    ax2.aspect = AxisAspect(1)

    ax3, hm3 = heatmap(fig[2,2], observable[3]; colormap= :thermal, nan_color= :red)
    ax3.aspect = AxisAspect(1)

    s = Observable(0) # counter of current step, also observable
    Colorbar(fig[1, 3], hm, width = 20,tellheight=false)
    rowsize!(fig.layout, 1 , ax.scene.px_area[].widths[2])

    return (fig, abmstepper, abmobs)

end

So the first update here was to understand if it’s possible to do the same thing with agents.jl v5, because !step signature change.

I also need some info of Agent.js dev to know if there is a more simple way to manage the double step for grid space : continuous (ants move) and discrete (food patches).

Actually i use a double step method to manage that :

     step!(abmstepper, model, ants_agent_step!, ants_model_step!, 1)
            step!(model.sugar_model, sugar_agent_step!, sugar_model_step!, 1)

I’m very interested to push a documented / updated version of this model, already implemented in python and netlogo) to use on HPC with OpenMOLE.

1 Like

Yes it is very much possible to do animated composite plots, see here Plotting and Interactivity · Agents.jl

Obviously in your case you won’t have the full interactive GUI as the left window, but rather an animatable plot.

Now that i’m ready to use latest version of Cairo + Agents with julia 1.7 :slight_smile: i try to change the methods.

Into my init_fig() method i set abmplot like this, by passing the corresponding ants_xx_step! :


function init_fig(model, observable)

    ...
    fig, abmstepper, abmobs = abmplot(model; ants_agent_step!, ants_model_step!, am= ants_marker, ac=ants_color, figure=(;resolution=(800,800)))
    ...   
    return (fig, abmstepper, abmobs)

Called like that :

fig, abmstepper, abmobs = init_fig(model, observable)

And i change the step! into main loop function :

  while Agents.until(s, rununtil, model)
            print("sugar remaining on world =  $(sum(model.sugar_model.sugar_landscape)) \n")
            recordframe!(io) # save current state
            if Agents.should_we_collect(s, model, true)
                Agents.collect_agent_data!(df_agent, model, adata, s)
            end
            if Agents.should_we_collect(s, model.sugar_model, true)
                Agents.collect_model_data!(df_model, model.sugar_model, mdata, s)
            end
        
            step!(abmobs, 1) # change here 
            step!(model.sugar_model, sugar_agent_step!, sugar_model_step!, 1)
            s += 1

        ...
        end

With

function ants_model_step!(model)
    model.tick += 1
end

But my ant model doesn’t step and run indifinetly, so something missing …


Update 2

I test only with this and it’s work, so it’s a problem with model calling with Observables stepping ?

step!(model,ants_agent_step!,ants_model_step!,1) #ants stepping
step!(model.sugar_model, sugar_agent_step!, sugar_model_step!, 1) #sugar stepping
            

Update 3

I continue to debug to understand @Datseris, doing this works :

abmobs = ABMObservable(model; agent_step! = ants_agent_step!, model_step! = ants_model_step!)

while Agents.until(s, rununtil, model)
    ....
    step!(abmobs,1)
    step!(model.sugar_model, sugar_agent_step!, sugar_model_step!, 1)
end

That’s work, so is there a problem in ambplot ABMObservable returned and step! ?


Update 4

I found the problem i think, the abmplot doesn’t trigger an error, even if the syntax is not correct …

BAD

 fig, abmstepper, abmobs = abmplot(model; ants_agent_step!, ants_model_step!, am= ants_marker, ac=ants_color, figure=(;resolution=(800,800)))

GOOD

 fig, abmstepper, abmobs = abmplot(model; agent_step! = ants_agent_step!, model_step! =  ants_model_step!, am= ants_marker, ac=ants_color, figure=(;resolution=(800,800)))

I push a first iteration of README doc and the updated model here : GitHub - reyman/julia-antworld-model

you should open a PR at AgentsExampleZoo.jl which adds this example. There it is much simpelr to give reviews to code.

1 Like