def test_HouseholdProbability_defaults_to_empty_kwargs_with_custom_distros(): def custom_sampler(x): return 0.5 prob = probability_samplers.HouseholdProbability(custom_sampler) assert prob.kwargs == {} custom_sampler('', **prob.kwargs)
def test_HouseholdProbability_accepts_functions(): def custom_sampler(x, kwarg): return 0.5 assert callable(custom_sampler) prob = probability_samplers.HouseholdProbability(custom_sampler, {'kwarg': 'kwarg'}) assert prob.kwargs == {'kwarg': 'kwarg'}
def test_HouseholdProbability_p_delegates_to_compute_probability_for_household_for_Household( mocker): mocker.patch.object(probability_samplers.HouseholdProbability, 'compute_probability_for_household', return_value=None) prob = probability_samplers.HouseholdProbability(0.5) hhld = Household(1) prob.p(hhld) probability_samplers.HouseholdProbability.compute_probability_for_household.assert_called_once_with( hhld)
def test_verify_probability_check_list_of_probabilities(): p_list = [ probability_samplers.HouseholdProbability(0.5), probability_samplers.ActivityProbability([''], 0.5), probability_samplers.SimpleProbability(0.5), 0.2 ] verified_p_list = probability_samplers.verify_probability(p_list) assert p_list[:-1] == verified_p_list[:-1] assert isinstance(verified_p_list[-1], probability_samplers.SimpleProbability) assert verified_p_list[-1].p(None) == 0.2
def test_household_policy_with_household_based_probability_with_a_satisfied_person_attribute( SmithHousehold, mocker): mocker.patch.object(modifiers.RemoveActivity, 'remove_household_activities') mocker.patch.object(random, 'random', side_effect=[0]) household = SmithHousehold # i.e. household is affected and affects activities on household level def discrete_sampler(obj, mapping, distribution): p = distribution for key in mapping: value = obj.attributes.get(key) if value is None: raise KeyError( f"Cannot find mapping: {key} in sampling features: {obj.attributes}" ) p = p.get(value) if p is None: raise KeyError( f"Cannot find feature for {key}: {value} in distribution: {p}" ) return p age_mapping = ['age'] below_10 = [i for i in range(11)] above_10 = [i for i in range(11, 101)] age_distribution = { **dict(zip(below_10, [1] * len(below_10))), **dict(zip(above_10, [0] * len(above_10))) } people_satisfying_age_condition_under_10 = 0 for pid, person in household.people.items(): people_satisfying_age_condition_under_10 += discrete_sampler( person, age_mapping, age_distribution) assert people_satisfying_age_condition_under_10 == 1 policy = policies.HouseholdPolicy( modifiers.RemoveActivity( ['education', 'escort', 'leisure', 'shop', 'work']), [ probability_samplers.HouseholdProbability(0.5), probability_samplers.PersonProbability( discrete_sampler, { 'mapping': age_mapping, 'distribution': age_distribution }) ]) policy.apply_to(household) modifiers.RemoveActivity.remove_household_activities.assert_called_once_with( household)
def test_HouseholdProbability_compute_probability_for_household_delegates_p_to_custom_callable( mocker): called = None def custom_sampler(x, kwarg): nonlocal called called = True return 0.5 prob = probability_samplers.HouseholdProbability(custom_sampler, {'kwarg': 'kwarg'}) hhld = Household(1) assert prob.compute_probability_for_household(hhld) == 0.5 assert called
def test_household_policy_with_household_based_probability( SmithHousehold, mocker): mocker.patch.object(modifiers.RemoveActivity, 'remove_household_activities') mocker.patch.object(random, 'random', side_effect=[0]) household = SmithHousehold # i.e. household is affected and affects activities on household level policy = policies.HouseholdPolicy( modifiers.RemoveActivity( ['education', 'escort', 'leisure', 'shop', 'work']), probability_samplers.HouseholdProbability(0.5)) policy.apply_to(household) modifiers.RemoveActivity.remove_household_activities.assert_called_once_with( household)
def test_HouseholdProbability_fails_non_probability_integers(): with pytest.raises(AssertionError): probability_samplers.HouseholdProbability(2)
def test_HouseholdProbability_accepts_integer(): probability_samplers.HouseholdProbability(1)
def test_HouseholdProbability_compute_probability_for_household_returns_same_level_p_for_floats( ): prob = probability_samplers.HouseholdProbability(0.5) assert prob.compute_probability_for_household(Household(1)) == 0.5
def test_HouseholdProbability_p_throws_exception_when_given_whatever(): prob = probability_samplers.HouseholdProbability(0.5) with pytest.raises(TypeError) as e: prob.p(None)
def test_HouseholdProbability_p_throws_exception_when_given_Activity(): prob = probability_samplers.HouseholdProbability(0.5) with pytest.raises(NotImplementedError) as e: prob.p(Activity(1))