1
0
mirror of https://github.com/gsi-upm/soil synced 2025-08-24 03:52:20 +00:00

Add rescheduling for received

This commit is contained in:
J. Fernando Sánchez
2023-05-19 16:19:50 +02:00
parent ee0c4517cb
commit 189836408f
34 changed files with 674 additions and 260 deletions

View File

@@ -11,6 +11,7 @@ def run_sim(model, **kwargs):
dump=False,
num_processes=1,
parameters={'num_agents': NUM_AGENTS},
seed="",
max_steps=MAX_STEPS,
iterations=NUM_ITERS)
opts.update(kwargs)

View File

@@ -8,7 +8,6 @@ class NoopAgent(Agent):
self.num_calls = 0
def step(self):
# import pdb;pdb.set_trace()
self.num_calls += 1

View File

@@ -10,7 +10,6 @@ class NoopAgent(Agent):
self.num_calls = 0
def step(self):
# import pdb;pdb.set_trace()
self.num_calls += 1

View File

@@ -0,0 +1,21 @@
from soil import Agent, Environment, Simulation, state
class NoopAgent(Agent):
num_calls = 0
@state(default=True)
def unique(self):
self.num_calls += 1
class NoopEnvironment(Environment):
num_agents = 100
def init(self):
self.add_agents(NoopAgent, k=self.num_agents)
self.add_agent_reporter("num_calls")
from _config import *
run_sim(model=NoopEnvironment)

View File

@@ -1,7 +1,7 @@
from soil import BaseAgent, Environment, Simulation
from soil import Agent, Environment, Simulation
class NoopAgent(BaseAgent):
class NoopAgent(Agent):
num_calls = 0
def step(self):
@@ -15,7 +15,6 @@ class NoopEnvironment(Environment):
self.add_agent_reporter("num_calls")
if __name__ == "__main__":
from _config import *
from _config import *
run_sim(model=NoopEnvironment)
run_sim(model=NoopEnvironment)

View File

@@ -1,5 +1,5 @@
from soil import Agent, Environment, Simulation
from soilent import Scheduler
from soil.time import SoilentActivation
class NoopAgent(Agent):
@@ -14,7 +14,7 @@ class NoopAgent(Agent):
class NoopEnvironment(Environment):
num_agents = 100
schedule_class = Scheduler
schedule_class = SoilentActivation
def init(self):
self.add_agents(NoopAgent, k=self.num_agents)
@@ -26,4 +26,4 @@ if __name__ == "__main__":
res = run_sim(model=NoopEnvironment)
for r in res:
assert isinstance(r.schedule, Scheduler)
assert isinstance(r.schedule, SoilentActivation)

View File

@@ -1,5 +1,5 @@
from soil import Agent, Environment
from soilent import PQueueScheduler
from soil.time import SoilentPQueueActivation
class NoopAgent(Agent):
@@ -12,7 +12,7 @@ class NoopAgent(Agent):
class NoopEnvironment(Environment):
num_agents = 100
schedule_class = PQueueScheduler
schedule_class = SoilentPQueueActivation
def init(self):
self.add_agents(NoopAgent, k=self.num_agents)
@@ -24,4 +24,4 @@ if __name__ == "__main__":
res = run_sim(model=NoopEnvironment)
for r in res:
assert isinstance(r.schedule, PQueueScheduler)
assert isinstance(r.schedule, SoilentPQueueActivation)

View File

@@ -1,5 +1,5 @@
from soil import Agent, Environment, Simulation
from soilent import Scheduler
from soil.time import SoilentActivation
class NoopAgent(Agent):
@@ -13,7 +13,7 @@ class NoopAgent(Agent):
class NoopEnvironment(Environment):
num_agents = 100
schedule_class = Scheduler
schedule_class = SoilentActivation
def init(self):
self.add_agents(NoopAgent, k=self.num_agents)
@@ -25,4 +25,4 @@ if __name__ == "__main__":
res = run_sim(model=NoopEnvironment)
for r in res:
assert isinstance(r.schedule, Scheduler)
assert isinstance(r.schedule, SoilentActivation)

View File

@@ -1,5 +1,5 @@
from soil import Agent, Environment
from soilent import PQueueScheduler
from soil.time import SoilentPQueueActivation
class NoopAgent(Agent):
@@ -13,7 +13,7 @@ class NoopAgent(Agent):
class NoopEnvironment(Environment):
num_agents = 100
schedule_class = PQueueScheduler
schedule_class = SoilentPQueueActivation
def init(self):
self.add_agents(NoopAgent, k=self.num_agents)
@@ -25,4 +25,4 @@ if __name__ == "__main__":
res = run_sim(model=NoopEnvironment)
for r in res:
assert isinstance(r.schedule, PQueueScheduler)
assert isinstance(r.schedule, SoilentPQueueActivation)

View File

@@ -0,0 +1,30 @@
from soil import Agent, Environment, Simulation, state
from soil.time import SoilentActivation
class NoopAgent(Agent):
num_calls = 0
@state(default=True)
async def unique(self):
while True:
self.num_calls += 1
# yield self.delay(1)
await self.delay()
class NoopEnvironment(Environment):
num_agents = 100
schedule_class = SoilentActivation
def init(self):
self.add_agents(NoopAgent, k=self.num_agents)
self.add_agent_reporter("num_calls")
if __name__ == "__main__":
from _config import *
res = run_sim(model=NoopEnvironment)
for r in res:
assert isinstance(r.schedule, SoilentActivation)

View File

@@ -1,5 +1,5 @@
from soil import BaseAgent, Environment, Simulation
from soilent import Scheduler
from soil.time import SoilentActivation
class NoopAgent(BaseAgent):
@@ -10,7 +10,7 @@ class NoopAgent(BaseAgent):
class NoopEnvironment(Environment):
num_agents = 100
schedule_class = Scheduler
schedule_class = SoilentActivation
def init(self):
self.add_agents(NoopAgent, k=self.num_agents)
@@ -21,4 +21,4 @@ if __name__ == "__main__":
from _config import *
res = run_sim(model=NoopEnvironment)
for r in res:
assert isinstance(r.schedule, Scheduler)
assert isinstance(r.schedule, SoilentActivation)

View File

@@ -1,5 +1,5 @@
from soil import BaseAgent, Environment, Simulation
from soilent import PQueueScheduler
from soil.time import SoilentPQueueActivation
class NoopAgent(BaseAgent):
@@ -10,7 +10,7 @@ class NoopAgent(BaseAgent):
class NoopEnvironment(Environment):
num_agents = 100
schedule_class = PQueueScheduler
schedule_class = SoilentPQueueActivation
def init(self):
self.add_agents(NoopAgent, k=self.num_agents)
@@ -21,4 +21,4 @@ if __name__ == "__main__":
from _config import *
res = run_sim(model=NoopEnvironment)
for r in res:
assert isinstance(r.schedule, PQueueScheduler)
assert isinstance(r.schedule, SoilentPqueueActivation)

View File

@@ -1,8 +1,9 @@
import os
from soil import simulation
NUM_AGENTS = int(os.environ.get('NUM_AGENTS', 100))
NUM_ITERS = int(os.environ.get('NUM_ITERS', 10))
MAX_STEPS = int(os.environ.get('MAX_STEPS', 1000))
MAX_STEPS = int(os.environ.get('MAX_STEPS', 500))
def run_sim(model, **kwargs):
@@ -22,11 +23,16 @@ def run_sim(model, **kwargs):
iterations=NUM_ITERS)
opts.update(kwargs)
its = Simulation(**opts).run()
assert len(its) == NUM_ITERS
assert all(it.schedule.steps == MAX_STEPS for it in its)
ratios = list(it.resistant_susceptible_ratio() for it in its)
print("Max - Avg - Min ratio:", max(ratios), sum(ratios)/len(ratios), min(ratios))
assert all(sum([it.number_susceptible,
it.number_infected,
it.number_resistant]) == NUM_AGENTS for it in its)
return its
if not simulation._AVOID_RUNNING:
ratios = list(it.resistant_susceptible_ratio for it in its)
print("Max - Avg - Min ratio:", max(ratios), sum(ratios)/len(ratios), min(ratios))
infected = list(it.number_infected for it in its)
print("Max - Avg - Min infected:", max(infected), sum(infected)/len(infected), min(infected))
assert all((it.schedule.steps == MAX_STEPS or it.number_infected == 0) for it in its)
assert all(sum([it.number_susceptible,
it.number_infected,
it.number_resistant]) == NUM_AGENTS for it in its)
return its

View File

@@ -100,6 +100,7 @@ class VirusOnNetwork(mesa.Model):
def number_infected(self):
return number_infected(self)
@property
def resistant_susceptible_ratio(self):
try:
return number_state(self, State.RESISTANT) / number_state(
@@ -176,5 +177,4 @@ class VirusAgent(mesa.Agent):
from _config import run_sim
run_sim(model=VirusOnNetwork)

View File

@@ -30,8 +30,12 @@ class VirusOnNetwork(Environment):
for a in self.agents(node_id=infected_nodes):
a.set_state(VirusAgent.infected)
assert self.number_infected == self.initial_outbreak_size
def step(self):
super().step()
@report
@property
def resistant_susceptible_ratio(self):
try:
return self.number_resistant / self.number_susceptible
@@ -59,34 +63,29 @@ class VirusAgent(Agent):
virus_check_frequency = None # Inherit from model
recovery_chance = None # Inherit from model
gain_resistance_chance = None # Inherit from model
just_been_infected = False
@state(default=True)
def susceptible(self):
if self.just_been_infected:
self.just_been_infected = False
return self.infected
async def susceptible(self):
await self.received()
return self.infected
@state
def infected(self):
susceptible_neighbors = self.get_neighbors(state_id=self.susceptible.id)
for a in susceptible_neighbors:
if self.prob(self.virus_spread_chance):
a.just_been_infected = True
a.tell(True, sender=self)
if self.prob(self.virus_check_frequency):
if self.prob(self.recovery_chance):
if self.prob(self.gain_resistance_chance):
return self.resistant
else:
return self.susceptible
else:
return self.infected
@state
def resistant(self):
return self.at(INFINITY)
if __name__ == "__main__":
from _config import run_sim
run_sim(model=VirusOnNetwork)
from _config import run_sim
run_sim(model=VirusOnNetwork)

View File

@@ -38,6 +38,7 @@ class VirusOnNetwork(Environment):
assert self.number_infected == self.initial_outbreak_size
@report
@property
def resistant_susceptible_ratio(self):
try:
return self.number_resistant / self.number_susceptible
@@ -99,6 +100,5 @@ class VirusAgent(Agent):
if __name__ == "__main__":
from _config import run_sim
run_sim(model=VirusOnNetwork)
from _config import run_sim
run_sim(model=VirusOnNetwork)