def test_update_individual(self): test = self.namespace_under_test # self.debug = True self.create_generic_gene_gina() curr_expected_gene_age = self.gene['expected']['age'] curr_expected_gina_age = self.gina['expected']['age'] timestep_size = 1 # TODO: figure out how to set / configure this gene = self.gene['observed'] gina = self.gina['observed'] gina_became_possible_mother = test.is_possible_mother(gina) gina_ceased_potential_motherhood = False age_of_potential_motherhood = None age_of_ceased_motherhood_potential = None self.assertFalse(gina_became_possible_mother, "gina should not be a possible mother at creation.") for x in range(14600): self.check_property_of_individual('age', curr_expected_gene_age, test.get_age(gene), individual_label="gene") self.check_property_of_individual('age', curr_expected_gina_age, test.get_age(gina), individual_label="gina") if not gina_became_possible_mother: gina_became_possible_mother = test.is_possible_mother(gina) if gina_became_possible_mother: age_of_potential_motherhood = curr_expected_gina_age elif not test.is_possible_mother( gina) and not gina_ceased_potential_motherhood: gina_ceased_potential_motherhood = True age_of_ceased_motherhood_potential = curr_expected_gina_age test.update(gene) test.update(gina) curr_expected_gina_age += timestep_size curr_expected_gene_age += timestep_size self.assertTrue(gina_became_possible_mother, "gina should have become a possible mother.") if self.debug: print( f"gina became a possible mother at age {age_of_potential_motherhood}.\nm" ) self.assertTrue(gina_ceased_potential_motherhood, "gina should have ceased being a potential mother.") if self.debug: print( f"gina ceased potential motherhood at age {age_of_ceased_motherhood_potential}.\n" )
def do_shedding_update(human_pop): # This is not optimal. Only optimize if it really helps global fertility if fertility is None: config = json.loads(open("nd.json").read()) fertility = config["Enable_Birth"] and config["Enable_Vital_Dynamics"] stat_pop = 0 for human in human_pop: hum_id = human["id"] mcw = gi.get_mcw(hum_id) #Can we make this conditional on if fertility: nd.update_node_stats( (mcw, 0, gi.is_possible_mother(hum_id), 0)) # mcw, infectiousness, is_poss_mom, is_infected """ if gi.is_infected(hum_id): if gi.has_latent_infection(hum_id): print( "{0} has latent infection.".format( hum_id ) ) else: print( "{0} has active infection (I guess).".format( hum_id ) ) else: print( "{0} has no infection.".format( hum_id ) ) """ stat_pop += mcw if gi.is_infected(hum_id): gi.update1(hum_id) # this should do shedding & vital-dynamics return stat_pop
def do_shedding_update(human_pop): for human in human_pop: hum_id = human["id"] nd.update_node_stats( (1.0, 0, gi.is_possible_mother(hum_id), 0)) # mcw, infectiousness, is_poss_mom, is_infected """ if gi.is_infected(hum_id): if gi.has_latent_infection(hum_id): print( "{0} has latent infection.".format( hum_id ) ) else: print( "{0} has active infection (I guess).".format( hum_id ) ) else: print( "{0} has no infection.".format( hum_id ) ) """ gi.update1(hum_id) # this should do shedding & vital-dynamics
def do_vitaldynamics_update(human_pop, graveyard, contagion, census_cb=None, death_cb=None): num_infected = 0 num_incubating = 0 num_active = 0 num_suscept = 0 num_recover = 0 num_people = 0 num_deaths = 0 new_graveyard = [] for human in human_pop: hum_id = human["id"] if census_cb != None: census_cb(hum_id) gi.update2( hum_id ) # this should do exposure; possible optimization would be to skip this entirely if zero contagion mcw = gi.get_mcw(hum_id) if gi.is_dead(hum_id): # somebody died print("{0} is dead.".format(hum_id)) new_graveyard.append(human) num_deaths += mcw # can't use len(graveyard) coz mcw if death_cb != None: death_cb(hum_id) num_people += mcw global fertility if fertility: ipm = gi.is_possible_mother(hum_id) ip = gi.is_pregnant(hum_id) if hum_id == 0: pdb.set_trace() age = gi.get_age(hum_id) #print( "Calling cfp with {0}, {1}, {2}, and {3}.".format( str(ipm), str(ip), str(age), str(hum_id) ) ) # TBD: Optimization? I happen to know that this is only necessary for females of a # certain age. But technically that knowledge is for nd. nd.consider_for_pregnancy((ipm, ip, hum_id, age, 1.0)) #print( str( json.loads(gi.serialize( hum_id ))["individual"]["susceptibility"] ) ) if gi.is_infected(hum_id): if is_incubating(hum_id): num_incubating += mcw else: num_infected += mcw # TBD: use_mcw elif gi.get_immunity(hum_id) != 1.0: num_recover += mcw # TBD: use mcw else: num_suscept += mcw # TBD: use mcw #if gi.has_active_infection( hum_id ): # num_active += 1 # serialize seems to be broken when you had an intervention (or at least a SimpleVaccine) #serial_man = gi.serialize( hum_id ) #if hum_id == 1: #print( json.dumps( json.loads( serial_man ), indent=4 ) ) #print( "infectiousness: " + str( json.loads( serial_man )["individual"]["infectiousness"] ) ) #print( "Updating fertility for this timestep." ) for corpse in new_graveyard: if corpse in human_pop: human_pop.pop(human_pop.index(corpse)) else: print("Exception trying to remove individual from python list: " + str(ex)) graveyard.extend(new_graveyard) nd.update_fertility() exposeds.append(num_incubating) prevalence.append(num_infected) active_prevalence.append(num_active) susceptible.append(num_suscept) recovered.append(num_recover) disdeaths.append(num_deaths)
def do_vitaldynamics_update(human_pop, graveyard, census_cb=None, death_cb=None): num_infected = 0 num_incubating = 0 num_active = 0 num_suscept = 0 num_recover = 0 new_graveyard = [] for human in human_pop: hum_id = human["id"] if census_cb != None: census_cb(hum_id) gi.update2(hum_id) # this should do exposure if gi.is_dead(hum_id): # somebody died print("{0} is dead.".format(hum_id)) new_graveyard.append(human) if death_cb != None: death_cb(hum_id) # TESTING THIS ipm = gi.is_possible_mother(hum_id) ip = gi.is_pregnant(hum_id) if hum_id == 0: pdb.set_trace() age = gi.get_age(hum_id) #print( "Calling cfp with {0}, {1}, {2}, and {3}.".format( str(ipm), str(ip), str(age), str(hum_id) ) ) nd.consider_for_pregnancy((ipm, ip, hum_id, age, 1.0)) #print( str( json.loads(gi.serialize( hum_id ))["individual"]["susceptibility"] ) ) if gi.is_infected(hum_id): if is_incubating(hum_id): num_incubating += 1 else: num_infected += 1 # TBD: use_mcw elif gi.get_immunity(hum_id) != 1.0: num_recover += 1 # TBD: use mcw else: num_suscept += 1 # TBD: use mcw #if gi.has_active_infection( hum_id ): # num_active += 1 # serialize seems to be broken when you had an intervention (or at least a SimpleVaccine) #serial_man = gi.serialize( hum_id ) #if hum_id == 1: #print( json.dumps( json.loads( serial_man ), indent=4 ) ) #print( "infectiousness: " + str( json.loads( serial_man )["individual"]["infectiousness"] ) ) #print( "Updating fertility for this timestep." ) for corpse in new_graveyard: if corpse in human_pop: human_pop.pop(human_pop.index(corpse)) else: print("Exception trying to remove individual from python list: " + str(ex)) graveyard.extend(new_graveyard) nd.update_fertility() exposeds.append(num_incubating) prevalence.append(num_infected) active_prevalence.append(num_active) susceptible.append(num_suscept) recovered.append(num_recover) disdeaths.append(len(graveyard))