Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
"""
Test the BatchRunner
"""
from functools import reduce
from operator import mul
import unittest
from mesa import Agent, Model
from mesa.time import BaseScheduler
from mesa.batchrunner import BatchRunner, ParameterProduct, ParameterSampler
NUM_AGENTS = 7
class MockAgent(Agent):
"""
Minimalistic agent implementation for testing purposes
"""
def __init__(self, unique_id, model, val):
super().__init__(unique_id, model)
self.unique_id = unique_id
self.val = val
def step(self):
self.val += 1
class MockModel(Model):
"""
Minimalistic model for testing purposes
"""
import numpy as np
from mesa import Agent
class Boid(Agent):
'''
A Boid-style flocker agent.
The agent follows three behaviors to flock:
- Cohesion: steering towards neighboring agents.
- Separation: avoiding getting too close to any other agent.
- Alignment: try to fly in the same direction as the neighbors.
Boids have a vision that defines the radius in which they look for their
neighbors to flock with. Their speed (a scalar) and velocity (a vector)
define their movement. Separation is their desired minimum distance from
any other Boid.
'''
def __init__(self, unique_id, model, pos, speed, velocity, vision,
separation, cohere=0.025, separate=0.25, match=0.04):
'''
try:
return number_state(self, State.RESISTANT) / number_state(self, State.SUSCEPTIBLE)
except ZeroDivisionError:
return math.inf
def step(self):
self.schedule.step()
# collect data
self.datacollector.collect(self)
def run_model(self, n):
for i in range(n):
self.step()
class VirusAgent(Agent):
def __init__(self, unique_id, model, initial_state, virus_spread_chance, virus_check_frequency,
recovery_chance, gain_resistance_chance):
super().__init__(unique_id, model)
self.state = initial_state
self.virus_spread_chance = virus_spread_chance
self.virus_check_frequency = virus_check_frequency
self.recovery_chance = recovery_chance
self.gain_resistance_chance = gain_resistance_chance
def try_to_infect_neighbors(self):
neighbors_nodes = self.model.grid.get_neighbors(self.pos, include_center=False)
susceptible_neighbors = [agent for agent in self.model.grid.get_cell_list_contents(neighbors_nodes) if
agent.state is State.SUSCEPTIBLE]
for a in susceptible_neighbors:
from mesa import Agent
class Customer(Agent):
""" A customer that can make transactions """
def __init__(self, customer_id, transaction_model, random_state):
super().__init__(customer_id, transaction_model)
self.random_state = random_state
# I am not a fraudster
self.fraudster = 0
# decide which currency to use
self.currency = self.pick_currency()
self.country = 'india'
# the customer's credit card
self.card = None
# transaction frequency (avg. purchases per day)
import numpy as np
from mesa import Agent
class Boid(Agent):
'''
A Boid-style flocker agent.
The agent follows three behaviors to flock:
- Cohesion: steering towards neighboring agents.
- Separation: avoiding getting too close to any other agent.
- Alignment: try to fly in the same direction as the neighbors.
Boids have a vision that defines the radius in which they look for their
neighbors to flock with. Their speed (a scalar) and velocity (a vector)
define their movement. Separation is their desired minimum distance from
any other Boid.
'''
def __init__(self, unique_id, model, pos, speed, velocity, vision,
separation, cohere=0.025, separate=0.25, match=0.04):
'''
self.grid.place_agent(a, list_of_random_nodes[i])
self.running = True
self.datacollector.collect(self)
def step(self):
self.schedule.step()
# collect data
self.datacollector.collect(self)
def run_model(self, n):
for i in range(n):
self.step()
class MoneyAgent(Agent):
""" An agent with fixed initial wealth."""
def __init__(self, unique_id, model):
super().__init__(unique_id, model)
self.wealth = 1
def move(self):
possible_steps = [node for node in self.model.grid.get_neighbors(self.pos, include_center=False) if
self.model.grid.is_cell_empty(node)]
if len(possible_steps) > 0:
new_position = random.choice(possible_steps)
self.model.grid.move_agent(self, new_position)
def give_money(self):
neighbors_nodes = self.model.grid.get_neighbors(self.pos, include_center=False)
from mesa import Model, Agent
from mesa.time import RandomActivation
from mesa.space import SingleGrid
from mesa.datacollection import DataCollector
class SchellingAgent(Agent):
'''
Schelling segregation agent
'''
def __init__(self, pos, model, agent_type):
'''
Create a new Schelling agent.
Args:
unique_id: Unique identifier for the agent.
x, y: Agent initial location.
agent_type: Indicator for the agent's type (minority=1, majority=0)
'''
super().__init__(pos, model)
self.pos = pos
self.type = agent_type
import random
import math
from mesa import Agent
class Citizen(Agent):
"""
A member of the general population, may or may not be in active rebellion.
Summary of rule: If grievance - risk > threshold, rebel.
Attributes:
unique_id: unique int
x, y: Grid coordinates
hardship: Agent's 'perceived hardship (i.e., physical or economic
privation).' Exogenous, drawn from U(0,1).
regime_legitimacy: Agent's perception of regime legitimacy, equal
across agents. Exogenous.
risk_aversion: Exogenous, drawn from U(0,1).
threshold: if (grievance - (risk_aversion * arrest_probability)) >
threshold, go/remain Active
vision: number of cells in each direction (N, S, E and W) that agent
can inspect
self.model.grid.move_agent(self, final_candidates[0])
def eat(self):
sugar_patch = self.get_sugar(self.pos)
self.sugar = self.sugar - self.metabolism + sugar_patch.amount
sugar_patch.amount = 0
def step(self):
self.move()
self.eat()
if self.sugar <= 0:
self.model.grid._remove_agent(self.pos, self)
self.model.schedule.remove(self)
class Sugar(Agent):
def __init__(self, pos, model, max_sugar):
super().__init__(pos, model)
self.amount = max_sugar
self.max_sugar = max_sugar
def step(self):
self.amount = min([self.max_sugar, self.amount + 1])
from mesa import Agent
class Authenticator(Agent):
def __init__(self, transaction_model, random_state, max_authentication_steps):
super().__init__(0, transaction_model)
self.random_state = random_state
self.max_authentication_steps = max_authentication_steps
def authorise_payment(self, customer, amount, merchant):
authorise = False
if self.random_state.uniform(0, 1, 1)[0] < 0.5:
second_auth_quality = customer.get_authentication()
if second_auth_quality is None:
authorise = False
elif second_auth_quality > 0.5:
authorise = True
else: