def infect(self, person: ps.Person): if person.disease_state[self] not in DISEASE_STATES_SUSCEPTIBLE: return #already done if person.disease_state[self] in DISEASE_STATES_VACCINATED: person.disease_state[self] = 'VII' else: person.disease_state[self] = 'II'
def test_infects(self): from PersonState import Person p0 = Person(self.tl_home, self.M) p1 = Person(self.tl_home, self.M) p0.disease_state[self.t_disease] = 'II' p1.disease_state[self.t_disease] = 'VS' assert(self.t_disease.infects(p0,p1))
def initialize_map_objects(self): # grab the population and the diseases from the data # note: format is (person id | current location | (disease name | disease state)) import re # first just the disease names, since it'll be repeated for everyone i = 3 # i should be on the name of the first disease (4th cell) while not re.match( r'[0-9]+', self.data[0] [i]): # while the current cell isn't a number (i.e. a person's id) # make a dummy disease to sit here with the right name (need this for typing to work right) from Disease import Disease Disease.DISEASE_ID_COUNTER = 0 dis = Disease(self.data[0][i]) self.diseases.update({self.data[0][i]: dis}) i += 2 # now go ahead and add the right amount of people # total number of cells = (num of people) * ((num of diseases) * 2 + 2) + 1 # so num of people = (number of cells - 1) / (2 * (num of diseases)) num_people = int( (len(self.data[0]) - 1) / ((2 * len(self.diseases)) + 2)) from PersonState import Person houses = None for _ in range(num_people): house, houses = self.M.get_random_house(houses) p = Person(house, self.M) # doesn't really matter what their home is self.population.append(p)
def test_disease_state_transition(self): from PersonState import Person p0 = Person(self.tl_home,self.M) p0.disease_state.update({self.t_disease : 'II'}) self.t_disease.disease_state_transition(p0) assert(p0.disease_state[self.t_disease] == 'IS') self.t_disease.disease_state_transition(p0) assert (p0.disease_state[self.t_disease] == 'D') p1 = Person(self.tl_home, self.M) p1.disease_state.update({self.t_disease: 'VII'}) self.t_disease.disease_state_transition(p1) assert (p1.disease_state[self.t_disease] == 'VIS') self.t_disease.disease_state_transition(p1) assert (p1.disease_state[self.t_disease] == 'VD')
def die(self, person: ps.Person): if coinflip(1 - person.get_effective_healthiness() ): #healthier means this is less likely to happen is_in_hopsital = person.currentLocation.loc_type == 'hospital' hospital_effect = 0. if is_in_hopsital: hospital_effect = HOSPITAL_TREATMENT_EFFECT * self.treatability return coinflip(max(0, self.die_probability - hospital_effect) ) #hospitals make it *less* likely that you'll die
def test_assign_friends(self): np.random.seed(0) people = [ Person(self.tl_home, self.M), Person(self.tl_tl_home, self.M), Person(self.tl_home, self.M), Person(self.tl_home, self.M), Person(self.tl_tl_home, self.M) ] pb = PopulationBuilder(self.M, 5) for p in people: pb.assign_primitive_details(p) # make sure they all hang out at least at one particular place p.add_place(self.br_shop) for p in people: pb.assign_friends(p) pass
def test_assign_partners(self): np.random.seed(0) people = [ Person(self.tl_home, self.M), Person(self.tl_home, self.M), Person(self.tl_home, self.M), Person(self.tl_home, self.M), Person(self.tl_home, self.M) ] pb = PopulationBuilder(self.M, 5) pb.set_partners_distribution(lambda num_people_in_house: min( int(coinflip(0.5)), num_people_in_house)) for p in people: pb.assign_primitive_details(p) for p in people: pb.assign_partners(p) pass
def test_assign_coworkers(self): np.random.seed(0) people = [ Person(self.tl_home, self.M), Person(self.tl_tl_home, self.M), Person(self.tl_home, self.M), Person(self.tl_home, self.M), Person(self.tl_tl_home, self.M) ] pb = PopulationBuilder(self.M, 5) for p in people: pb.assign_primitive_details(p) #make sure their workplace is all the same p.set_workplace(self.L_office) #now assign coworkers for p in people: pb.assign_coworkers(p) pass
def test_infection_round(self): from PersonState import Person p0 = Person(self.tl_home, self.M) p1 = Person(self.tl_home, self.M) p2 = Person(self.tl_home, self.M) p3 = Person(self.tl_home, self.M) p4 = Person(self.tl_home, self.M) p0.disease_state[self.t_disease] = 'II' p1.disease_state[self.t_disease] = 'VS' p2.disease_state[self.t_disease] = 'S' p3.disease_state[self.t_disease] = 'VU' p4.disease_state[self.t_disease] = 'R' self.tl_home.infection_round() assert (p0.disease_state[self.t_disease] == 'II') assert (p1.disease_state[self.t_disease] == 'VII') assert (p2.disease_state[self.t_disease] == 'II') assert (p3.disease_state[self.t_disease] == 'VU') assert (p4.disease_state[self.t_disease] == 'R')
def test_assign_primitive_details(self): np.random.seed(0) p = Person(self.tl_home, self.M) pb = PopulationBuilder(self.M, 1) pb.assign_primitive_details(p) #normal unit stuff assert (p.home == self.tl_home) assert (p.M == self.M) assert (p.currentLocation == self.tl_home) for t in range(*p.sleep_schedule): assert (not time_within_tuple(t, p.work_schedule) ) #not asleep during work pass
def test_place_people(self): v = False # use the map reader since making one of these by hand is going to be a pain from PersonState import Location Location.LOCATION_ID_COUNTER = 0 mr = MapReader(PUBLIC_BLOCK_SIZE=(2, 2), CAPACITY_PER_PIXEL=2, TIME_STEP_PER_PIXEL=2, RECORD_LOCATION_PIXELS=True) # NEED to set record location pixels mw = MapWriter() mw.read_img('../test_map_small.png',mr) mw.read_data('mapwriter_data_test.psv') mw.format_img() tl_tl_home = mw.M.loc_list[0] # top left home # put a bunch of randos in the tl home np.random.seed(0) from PersonState import Person Person.PERSON_ID_COUNTER = 0 people = [ Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M), ] # 5 should fit with the 1 space constraint ret = mw.place_people(tl_tl_home) # regress on this result assert (ret[people[0]] == (17, 16)) assert (ret[people[1]] == (14, 8)) assert (ret[people[2]] == (0, 15)) assert (ret[people[3]] == (10, 2)) assert (ret[people[4]] == (18, 7)) # now cram 'em in *just* tight enough to cause it to warn us Person.PERSON_ID_COUNTER = 0 mw = MapWriter() mw.initialize_all('../test_map_small.png', 'mapwriter_data_test.psv', mr) Person.PERSON_ID_COUNTER = 0 people = [ Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M), Person(tl_tl_home, mw.M) ] assert (funcall_throws_error(mw.place_people, tl_tl_home, error_on_overlay=True))
def disease_state_transition(self, person: ps.Person): if (person.disease_state[self] == 'II') and (self.symptom_show()): person.disease_state[self] = 'IS' elif (person.disease_state[self] == 'VII') and (self.symptom_show()): person.disease_state[self] = 'VIS' elif (person.disease_state[self] == 'IS') and (self.recover(person)): person.disease_state[self] = 'R' elif (person.disease_state[self] == 'VIS') and (self.recover(person)): person.disease_state[self] = 'VR' elif (person.disease_state[self] == 'IS') and (self.die(person)): person.disease_state[self] = 'D' person.die() #F elif (person.disease_state[self] == 'VIS') and (self.die(person)): person.disease_state[self] = 'VD' person.die() #F #set the diseases showing symptoms variable for disease in person.disease_state: if person.disease_state[disease] in DISEASE_STATES_SYMPTOMATIC: person.diseasesShowingSymptoms = True return person.diseasesShowingSymptoms = False