import numpy as np from . import FSM, state class SISaModel(FSM): """ Settings: neutral_discontent_spon_prob neutral_discontent_infected_prob neutral_content_spon_prob neutral_content_infected_prob discontent_neutral discontent_content variance_d_c content_discontent variance_c_d content_neutral standard_variance """ def __init__(self, environment, unique_id=0, state=()): super().__init__(model=environment, unique_id=unique_id, state=state) random = np.random.default_rng(seed=self._seed) self.neutral_discontent_spon_prob = random.normal( self.env["neutral_discontent_spon_prob"], self.env["standard_variance"] ) self.neutral_discontent_infected_prob = random.normal( self.env["neutral_discontent_infected_prob"], self.env["standard_variance"] ) self.neutral_content_spon_prob = random.normal( self.env["neutral_content_spon_prob"], self.env["standard_variance"] ) self.neutral_content_infected_prob = random.normal( self.env["neutral_content_infected_prob"], self.env["standard_variance"] ) self.discontent_neutral = random.normal( self.env["discontent_neutral"], self.env["standard_variance"] ) self.discontent_content = random.normal( self.env["discontent_content"], self.env["variance_d_c"] ) self.content_discontent = random.normal( self.env["content_discontent"], self.env["variance_c_d"] ) self.content_neutral = random.normal( self.env["content_neutral"], self.env["standard_variance"] ) @state def neutral(self): # Spontaneous effects if self.prob(self.neutral_discontent_spon_prob): return self.discontent if self.prob(self.neutral_content_spon_prob): return self.content # Infected discontent_neighbors = self.count_neighboring_agents(state_id=self.discontent) if self.prob(scontent_neighbors * self.neutral_discontent_infected_prob): return self.discontent content_neighbors = self.count_neighboring_agents(state_id=self.content.id) if self.prob(s * self.neutral_content_infected_prob): return self.content return self.neutral @state def discontent(self): # Healing if self.prob(self.discontent_neutral): return self.neutral # Superinfected content_neighbors = self.count_neighboring_agents(state_id=self.content.id) if self.prob(s * self.discontent_content): return self.content return self.discontent @state def content(self): # Healing if self.prob(self.content_neutral): return self.neutral # Superinfected discontent_neighbors = self.count_neighboring_agents( state_id=self.discontent.id ) if self.prob(scontent_neighbors * self.content_discontent): self.discontent return self.content