예제 #1
0
 def did_infection_after_marcov(self) -> bool:
     if self.infection_occurred is None:
         prb_infection = self.prob_infection
         prb_infection *= self.config.rate_pessimism_factor
         self.infection_occurred = marcov_binary(self.prob_infection)
     
     return self.infection_occurred
예제 #2
0
    def infect(self, person: Person, day: int, cause: str) -> None:
        person.infected_by = cause
        person.infected_on = day
        person.symptomatic = marcov_binary(
            self.config.symptomatic_dist().sample())

        symptoms_start = person.infected_on + self.config.days_to_symptoms_dist(
        ).sample()  # no symptoms is asymptomatic, but still used later
        contagious_offset = self.config.contagious_offset_rel_symptoms(
            person.symptomatic).sample()
        contagious_start = symptoms_start + contagious_offset
        if contagious_start <= day:
            contagious_start = day + 1

        person.contagious_from_inc = contagious_start
        person.contagious_duration = self.config.contagious_duration_dist(
            person.symptomatic).sample()
        person.contagious_to_inc = person.contagious_from_inc + person.contagious_duration - 1

        if person.symptomatic:
            person.symptoms_start = symptoms_start
            person.warn_potential_infection_on(
                person.symptoms_start -
                self.config.warn_interactions_days_before_symptoms,
                person.symptoms_start)
예제 #3
0
 def __a_infected_b_after_marcov(self, pa: Person, pb: Person) -> bool:
     if pa.id == pb.id:
         return False
     if pa.practically_contagious(self.day.sample()):
         prb_infection = self.prob_infection
         prb_infection *= self.config.rate_pessimism_factor
         if not pa.symptomatic:
             prb_infection *= self.config.asymptomatic_infectious_factor
         if prb_infection > 1:
             prb_infection = 1
         return marcov_binary(prb_infection)
     return False
예제 #4
0
    def maybe_infect_person(self, person: Person) -> tuple[bool, str]:
        if person.is_infected_on_day(self.day):
            return False, "already infected"

        if marcov_binary(person.base_day_rate.sample()):
            return True, "base:0"

        for evt in person.get_events_after_marcov(self.day):
            if evt.did_infection_after_marcov():
                return True, f"event:{evt.description}"

        for inter in person.get_interactions_after_marcov(self.day):
            if inter.was_person_infected_after_marcov(person):
                return True, f"interaction:{inter.description}"

        return False, "not infected"
예제 #5
0
    def did_occur_after_marcov(self) -> bool:
        if self.__event_occurred is None:
            self.__event_occurred = marcov_binary(self.probability_occurring)

        return self.__event_occurred
예제 #6
0
 def is_trustworthy(self) -> bool:
     if self._is_trustworthy is None:
         self._is_trustworthy = marcov_binary(self.trustworthy_prb)
     return self._is_trustworthy
예제 #7
0
 def start_and_propagate(self, num_days) -> None:
     for person in self.people.values():
         if marcov_binary(person.starting_infected_prb):
             self.infect(person, 0, "started-infected")
     self.propagate(num_days)