Пример #1
0
 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))
Пример #3
0
    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')
Пример #5
0
 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))
Пример #12
0
    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