Esempio n. 1
0
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)
Esempio n. 2
0
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'
Esempio n. 3
0
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)
Esempio n. 4
0
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'
Esempio n. 5
0
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)
Esempio n. 6
0
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)
Esempio n. 7
0
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)
Esempio n. 8
0
def test_subclass_name_features_in_str_string():
    policy = policies.HouseholdPolicy(modifiers.Modifier(), 0.1)
    assert '{}'.format(policy.__class__.__name__) in policy.__str__()