Code your model

Once your environment is set up correctly, you can start coding your model by going through the following steps.


1: Create a model.py file

Create a file named model.py file in the root/main directory of your project.

2: Import modules and define class

We will be using the Modelpy Python package to build our model. We'll also import the random module to create our initial data and mutate each node during our timestep function. Let's import our modules and then initialize our model.

from modelpy_abm.main import AgentModel
import random

# Define instance
model = AgentModel()

3: Define the parameters of your model.

This will define your model's parameters. Only the parameters that are strings or numbers will be editable in the Modelpy interface.

model["num_nodes"] = 7
model["default_bias"] = 0.15

# We can also define our parameters with this helper function
model.update_parameters({"num_nodes": 7, "default_bias": 0.15})

4: Define your function to generate the initial_data for each node.

This will define how each node is initialized or reset in the Modelpy interface.

def generateInitialData():
    return {"x_location": random.randint(1, 50), "y_location": random.randint(1, 50)}

model.set_initial_data_function(generateInitialData)

5: Define the timestep function.

This will define the logic that your model will perform at every timestep.

def generateTimestepData(model: AgentModel):
    graph = model.get_graph()
    for _node, node_data in graph.nodes(data=True):
        node_data["x_location"] += random.randint(-10, 10)

    model.set_graph(graph)

model.set_timestep_function(generateTimestepData)

6: Run your model

Now that you have successfully created your model, you can now run it using the following code:

# Initialize the graph
model.initialize_graph()

# Run for loop for number of timesteps
timesteps = 100

for _ in range(timesteps):
    model.timestep()

# Print results
print(model.get_graph())

We can also run our model to convergence with the following code:

# Set the convergence_data_key and convergence_std_dev
model["convergence_data_key"] = "x_position"
model["convergence_std_dev"] = 5

# Get the timestep at which the model converges
time_of_convergence = model.run_to_convergence()

# Print results
print(f"The model converges at {time_of_convergence}")

7: Review

Here's what the full file looks like once we're done.

from modelpy_abm.main import AgentModel
import random

# Template initial data and timestep data functions


def generateInitialData():
    return {"x_location": random.randint(1, 50), "y_location": random.randint(1, 50)}


def generateTimestepData(model: AgentModel):
    graph = model.get_graph()
    for _node, node_data in graph.nodes(data=True):
        node_data["x_location"] += random.randint(-10, 10)

    model.set_graph(graph)


# Define AgentModel instance
model = AgentModel()

model["num_nodes"] = 7
model["default_bias"] = 0.15

# We can also define our parameters with this helper function
model.update_parameters({"num_nodes": 7, "default_bias": 0.15})


model.set_initial_data_function(generateInitialData)
model.set_timestep_function(generateTimestepData)

# Initialize the graph
model.initialize_graph()
# Run for loop for number of timesteps
timesteps = 100

for _ in range(timesteps):
    model.timestep()

# Print results
print(model.get_graph())