def test_HouseholdPolicy_apply_to_delegates_to_modifier_policy_apply_to_for_list_of_probabilities( mocker, SmithHousehold): mocker.patch.object(modifiers.RemoveActivity, 'apply_to') policy = policies.HouseholdPolicy(modifiers.RemoveActivity( ['']), [1., probability_samplers.SimpleProbability(1.)]) household = SmithHousehold policy.apply_to(household) modifiers.RemoveActivity.apply_to.assert_called_once_with(household)
def test_HouseholdPolicy_does_nothing_if_not_selected_for_single_probability( mocker, SmithHousehold): mocker.patch.object(modifiers.RemoveActivity, 'apply_to') mocker.patch.object(random, 'random', return_value=0.7) policy = policies.HouseholdPolicy(modifiers.RemoveActivity(['']), 0.5) household = SmithHousehold policy.apply_to(household) assert not modifiers.RemoveActivity.apply_to.called, 'method should not have been called'
def test_household_policy_with_activity_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. Bobby's education activity 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.ActivityProbability( ['education', 'escort', 'leisure', 'shop', 'work'], 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_HouseholdPolicy_does_nothing_if_attribute_filter_condition_not_satisfied( mocker, SmithHousehold): mocker.patch.object(modifiers.RemoveActivity, 'apply_to') mocker.patch.object(filters.Filter, 'satisfies_conditions', return_value=False) policy = policies.HouseholdPolicy(modifiers.RemoveActivity(['']), 0.5, filters.Filter()) household = SmithHousehold policy.apply_to(household) assert not modifiers.RemoveActivity.apply_to.called, 'method should not have been called'
def test_HouseholdPolicy_apply_to_delegates_to_modifier_policy_apply_to_for_single_probability( mocker, SmithHousehold): mocker.patch.object(modifiers.RemoveActivity, 'apply_to') mocker.patch.object(probability_samplers.SimpleProbability, 'sample', return_value=True) policy = policies.HouseholdPolicy( modifiers.RemoveActivity(['']), probability_samplers.SimpleProbability(1.)) household = SmithHousehold policy.apply_to(household) modifiers.RemoveActivity.apply_to.assert_called_once_with(household)
def test_household_policy_with_person_based_probability( SmithHousehold, mocker): mocker.patch.object(modifiers.RemoveActivity, 'remove_household_activities') mocker.patch.object(random, 'random', side_effect=[0.06249]) household = SmithHousehold # i.e. Bobby is affected and affects activities on household level policy = policies.HouseholdPolicy( modifiers.RemoveActivity( ['education', 'escort', 'leisure', 'shop', 'work']), probability_samplers.PersonProbability(0.5)) policy.apply_to(household) modifiers.RemoveActivity.remove_household_activities.assert_called_once_with( household)
def test_HouseholdPolicy_verifies_for_appropriate_probabilities(mocker): mocker.patch.object(probability_samplers, 'verify_probability') policies.HouseholdPolicy(modifiers.RemoveActivity(['']), 0.5) probability_samplers.verify_probability.assert_called_once_with(0.5)
def test_subclass_name_features_in_str_string(): policy = policies.HouseholdPolicy(modifiers.Modifier(), 0.1) assert '{}'.format(policy.__class__.__name__) in policy.__str__()