Data Collection Issue With Julia Agents


mdata = [:Social] returns the same graph over and over without updating, I can’t seem to find the reason, any ideas?

1 Like

From what you’ve posted it seems as if you only create your graph once and never change it. Do you ever update model.Social during your model_step! function?

Of course we don’t know what your use case/model purpose is, so this is a bit of a wild guess but are you sure you want to use a GridSpace and then create a graph from the present agents? Perhaps look at our SIR example to see how you can directly use a GraphSpace instead.


Please note that reading code on screenshots is a bit unpleasant. You might want to consider using backticks `` to fence your code and allow for nice formatting like this:

using Agents
model = create_model(; dims=(L,L), density)
# and so on
1 Like

Welcome! To make it easer to help you, please consult this short post with some tips & tricks:

1 Like

I will fence from now on, thanks for the tip!

I do update model.Social, but I do this during the agent_step!
This is another thing I am confused about, as far as I understand you can only have run!(model,agent_step!,model_step!,etc...), but I need something like (model,agent_step1!,model_step1!,agent_step2!,model_step2!,etc...), this is just the way my model needs to be updated. Regarding the use of` GridSpace over GraphSpace, I don’t need the agents walking over a network per-say, but rather a grid torus topology, then I construct social networks based on some other criterion. Anyways the code that updates model.Social is here:

    for i = 1:numagents
        for j = 1:numagents
            if i==j
                continue
                else
                add_edge!(model.Social, i, j, (model[i].probability + model[j].probability) * (1-abs(model[j].probability-model[i].probability))/2)
            end
        end
    end        
end

Note that i’ve fixed the issue by including obtainer = copy at the end of my run!(), I saw someone having similar trouble and this seemed to be the trick, but is this the best solution? Sorry I am new to using agents / julia and I’m still figuring things out, thanks for the advice!

This can be easily done if you implement your agent_step! logic inside the model_step! function. Just iterate over the agents (or a subset) in whichever way you like: either by using a predefined scheduler from the Schedulers submodule or by simply defining your own iteration specifications. Something like this:

function model_step!(model)
    for agent in allagents(model)
        agent.variable += rand()
    end
    
    model.variable = mean(agent.variable for agent in allagents(model))

    for agent in allagents(model)
        agent.variable2 = agent.variable / model.variable
    end
end

For reference, see Tutorial · Agents.jl.

1 Like

From the docs of run!:

obtainer = identity : method to transfer collected data to the DataFrame . Typically only change this to copy if some data are mutable containers (e.g. Vector ) which change during evolution, or deepcopy if some data are nested mutable containers. Both of these options have performance penalties.

So yes, I think this is the correct approach. Note that I haven’t faced a case like yours yet, so I’m not totally sure if there are other or even better ways to do it.

2 Likes

This lightgraphs integration example in the docs may also help you out.

1 Like

I suppose I will be doing a lot of testing and might end up preprocessing the data to avoid the performance penalties attributed to using obtainer = copy. Thanks for your speedy replies @fbanning, I’m writing my masters thesis (coding it all in Julia), so I’m sure you will see me on the forums again haha…
Big thanks!

1 Like