Exemplo n.º 1
0
def create_c_array(array, ctype):
    """
    Create a C version of a numpy array or Python list

    array : list or numpy array
        Array for which a C representation is wanted
    
    Returns
    -------
    array_c : 
        C array to which the Python array is to be copied
    """
    N = len(array)

    if ctype == "double":
        array_c = covid19.doubleArray(N)
    elif ctype == "long":
        array_c = covid19.longArray(N)
    elif ctype == "int":
        array_c = covid19.intArray(N)
    else:
        print("Error: unknown data type")
        return

    for i in range(N):
        array_c[i] = array[i]
    return (array_c)
Exemplo n.º 2
0
 def __init__(
     self,
     frac_0_9   = 0,
     frac_10_19 = 0,
     frac_20_29 = 0,
     frac_30_39 = 0,
     frac_40_49 = 0,
     frac_50_59 = 0,
     frac_60_69 = 0,
     frac_70_79 = 0,
     frac_80    = 0,
     vaccine_type    = 0,
     efficacy        = 1.0,
     time_to_protect = 15,
     vaccine_protection_period = 365
 ):
     fraction_to_vaccinate = [
         frac_0_9,   frac_10_19, frac_20_29, frac_30_39, frac_40_49,
         frac_50_59, frac_60_69, frac_70_79, frac_80,
     ]
 
     self.c_fraction_to_vaccinate = covid19.doubleArray( len(AgeGroupEnum)  )
     for age in AgeGroupEnum:
         self.c_fraction_to_vaccinate[ age.value ] = fraction_to_vaccinate[ age.value ]
     
     self.vaccine_type    = vaccine_type
     self.efficacy        = efficacy
     self.time_to_protect = time_to_protect
     self.vaccine_protection_period = vaccine_protection_period
     
     self.c_total_vaccinated = covid19.longArray( len(AgeGroupEnum)  )
     for age in AgeGroupEnum:
         self.c_total_vaccinated[ age.value ] = 0
Exemplo n.º 3
0
    def add_new_strain(self, transmission_multiplier, hospitalised_fraction = None ):     
        
        """
        Add a new strain, note the total number of strains that can be added is set by the initial 
        parameters max_n_strains
        
        transmission_multiplier - the relative transmissibility of the new strain
        hospitalised_fraction - the fraction of symptomatic (not mild) who progress to hospital [default: None is no change)
        
        """  

        n_strains = self.c_model.n_initialised_strains;
        max_n_strains = self._params_obj.get_param("max_n_strains")

        if n_strains == max_n_strains :
            raise ModelException( f"cannot add any more strains - increase the parameter max_n_strains at the initialisation of the model" )    
        
        hospitalised_fraction_c = covid19.doubleArray( len(AgeGroupEnum) ) 
        if hospitalised_fraction == None :
            covid19.get_param_array_hospitalised_fraction(self.c_params, hospitalised_fraction_c)
        else :
            for idx in range( len(AgeGroupEnum ) ) :
                hospitalised_fraction_c[ idx ] = hospitalised_fraction[ idx ]
           
        idx = covid19.add_new_strain( self.c_model, transmission_multiplier, hospitalised_fraction_c );

        return Strain( self, idx )
Exemplo n.º 4
0
    def __init__(
        self,
        frac_0_9   = 0,
        frac_10_19 = 0,
        frac_20_29 = 0,
        frac_30_39 = 0,
        frac_40_49 = 0,
        frac_50_59 = 0,
        frac_60_69 = 0,
        frac_70_79 = 0,
        frac_80    = 0,
        vaccine    = -1,
    ):
        fraction_to_vaccinate = [
            frac_0_9,   frac_10_19, frac_20_29, frac_30_39, frac_40_49,
            frac_50_59, frac_60_69, frac_70_79, frac_80,
        ]
    
        self.c_fraction_to_vaccinate = covid19.doubleArray( len(AgeGroupEnum)  )
        for age in AgeGroupEnum:
            self.c_fraction_to_vaccinate[ age.value ] = fraction_to_vaccinate[ age.value ]
        
        if not isinstance( vaccine, Vaccine ) :
            ModelException( "argument vaccine must be an object of type Vaccine, add one using model.add_vaccine()")

        self.vaccine = vaccine
        
        self.c_total_vaccinated = covid19.longArray( len(AgeGroupEnum)  )
        for age in AgeGroupEnum:
            self.c_total_vaccinated[ age.value ] = 0
Exemplo n.º 5
0
    def test_gamma_rate_curve(self, N, mu, sigma, factor):
        a, b = get_gamma_params(mu, sigma)

        array_scipy = factor * np.diff(
            gamma.cdf((np.arange(N + 1)), a, loc=0, scale=b))

        array_c = covid19.doubleArray(N)
        covid19.gamma_rate_curve(array_c, N, mu, sigma, factor)
        array_c = c_array_as_python_list(array_c, N)

        np.testing.assert_array_almost_equal(array_c, array_scipy, decimal=4)
Exemplo n.º 6
0
    def test_copy_array(self):
        N = 100
        array = np.random.uniform(1, N, N)
        array_from = create_c_array(array, ctype="double")
        array_to = covid19.doubleArray(N)

        covid19.copy_array(array_to, array_from, N)

        # Convert back to Python objects
        array_from = c_array_as_python_list(array_from, N)
        array_to = c_array_as_python_list(array_to, N)

        np.testing.assert_array_equal(array_from, array_to)
Exemplo n.º 7
0
    def test_set_get_array_parameters(self):
        """
        Test that an array parameter inside the C parameters structure can be changed
        """
        params = covid19.parameters()

        # Define arrays
        get_age_types = covid19.doubleArray(covid19.N_AGE_TYPES)
        set_age_types = covid19.doubleArray(covid19.N_AGE_TYPES)
        for i in range(covid19.N_AGE_TYPES):
            set_age_types[i] = uniform(FLOAT_START, FLOAT_END)

        get_work_networks = covid19.doubleArray(covid19.N_DEFAULT_OCCUPATION_NETWORKS)
        set_work_networks = covid19.doubleArray(covid19.N_DEFAULT_OCCUPATION_NETWORKS)
        for i in range(covid19.N_DEFAULT_OCCUPATION_NETWORKS):
            set_work_networks[i] = uniform(FLOAT_START, FLOAT_END)

        get_interaction_types = covid19.doubleArray(covid19.N_INTERACTION_TYPES)
        set_interaction_types = covid19.doubleArray(covid19.N_INTERACTION_TYPES)
        for i in range(covid19.N_INTERACTION_TYPES):
            set_interaction_types[i] = uniform(FLOAT_START, FLOAT_END)

        get_age_groups = covid19.doubleArray(covid19.N_AGE_GROUPS)
        set_age_groups = covid19.doubleArray(covid19.N_AGE_GROUPS)
        for i in range(covid19.N_AGE_GROUPS):
            set_age_groups[i] = uniform(FLOAT_START, FLOAT_END)

        get_household_max = covid19.doubleArray(covid19.N_HOUSEHOLD_MAX)
        set_household_max = covid19.doubleArray(covid19.N_HOUSEHOLD_MAX)
        for i in range(covid19.N_HOUSEHOLD_MAX):
            set_household_max[i] = uniform(FLOAT_START, FLOAT_END)

        # Test set/get functions
        covid19.set_param_array_mean_random_interactions(params, set_age_types)
        covid19.get_param_array_mean_random_interactions(params, get_age_types)
        for i in range(covid19.N_AGE_TYPES):
            np.testing.assert_equal(set_age_types[i], get_age_types[i])

        covid19.set_param_array_sd_random_interactions(params, set_age_types)
        covid19.get_param_array_sd_random_interactions(params, get_age_types)
        for i in range(covid19.N_AGE_TYPES):
            np.testing.assert_equal(set_age_types[i], get_age_types[i])

        covid19.set_param_array_mean_work_interactions(params, set_work_networks)
        covid19.get_param_array_mean_work_interactions(params, get_work_networks)
        for i in range(covid19.N_DEFAULT_OCCUPATION_NETWORKS):
            np.testing.assert_equal(set_work_networks[i], get_work_networks[i])

        covid19.set_param_array_relative_susceptibility(params, set_age_groups)
        covid19.get_param_array_relative_susceptibility(params, get_age_groups)
        for i in range(covid19.N_AGE_GROUPS):
            np.testing.assert_equal(set_age_groups[i], get_age_groups[i])

        covid19.set_param_array_adjusted_susceptibility(params, set_age_groups)
        covid19.get_param_array_adjusted_susceptibility(params, get_age_groups)
        for i in range(covid19.N_AGE_GROUPS):
            np.testing.assert_equal(set_age_groups[i], get_age_groups[i])

        covid19.set_param_array_relative_transmission(params, set_interaction_types)
        covid19.get_param_array_relative_transmission(params, get_interaction_types)
        for i in range(covid19.N_INTERACTION_TYPES):
            np.testing.assert_equal(set_interaction_types[i], get_interaction_types[i])

        covid19.set_param_array_hospitalised_fraction(params, set_age_groups)
        covid19.get_param_array_hospitalised_fraction(params, get_age_groups)
        for i in range(covid19.N_AGE_GROUPS):
            np.testing.assert_equal(set_age_groups[i], get_age_groups[i])

        covid19.set_param_array_critical_fraction(params, set_age_groups)
        covid19.get_param_array_critical_fraction(params, get_age_groups)
        for i in range(covid19.N_AGE_GROUPS):
            np.testing.assert_equal(set_age_groups[i], get_age_groups[i])

        covid19.set_param_array_fatality_fraction(params, set_age_groups)
        covid19.get_param_array_fatality_fraction(params, get_age_groups)
        for i in range(covid19.N_AGE_GROUPS):
            np.testing.assert_equal(set_age_groups[i], get_age_groups[i])

        covid19.set_param_array_household_size(params, set_household_max)
        covid19.get_param_array_household_size(params, get_household_max)
        for i in range(covid19.N_HOUSEHOLD_MAX):
            np.testing.assert_equal(set_household_max[i], get_household_max[i])

        covid19.set_param_array_population(params, set_age_groups)
        covid19.get_param_array_population(params, get_age_groups)
        for i in range(covid19.N_AGE_GROUPS):
            np.testing.assert_equal(set_age_groups[i], get_age_groups[i])

        covid19.set_param_array_fraction_asymptomatic(params, set_age_groups)
        covid19.get_param_array_fraction_asymptomatic(params, get_age_groups)
        for i in range(covid19.N_AGE_GROUPS):
            np.testing.assert_equal(set_age_groups[i], get_age_groups[i])

        covid19.set_param_array_mild_fraction(params, set_age_groups)
        covid19.get_param_array_mild_fraction(params, get_age_groups)
        for i in range(covid19.N_AGE_GROUPS):
            np.testing.assert_equal(set_age_groups[i], get_age_groups[i])

        covid19.set_param_array_location_death_icu(params, set_age_groups)
        covid19.get_param_array_location_death_icu(params, get_age_groups)
        for i in range(covid19.N_AGE_GROUPS):
            np.testing.assert_equal(set_age_groups[i], get_age_groups[i])

        covid19.set_param_array_app_users_fraction(params, set_age_groups)
        covid19.get_param_array_app_users_fraction(params, get_age_groups)
        for i in range(covid19.N_AGE_GROUPS):
            np.testing.assert_equal(set_age_groups[i], get_age_groups[i])