Example #1
0
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)
Example #2
0
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'}
Example #3
0
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)
Example #4
0
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
Example #5
0
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)
Example #6
0
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
Example #7
0
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)
Example #8
0
def test_HouseholdProbability_fails_non_probability_integers():
    with pytest.raises(AssertionError):
        probability_samplers.HouseholdProbability(2)
Example #9
0
def test_HouseholdProbability_accepts_integer():
    probability_samplers.HouseholdProbability(1)
Example #10
0
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
Example #11
0
def test_HouseholdProbability_p_throws_exception_when_given_whatever():
    prob = probability_samplers.HouseholdProbability(0.5)
    with pytest.raises(TypeError) as e:
        prob.p(None)
Example #12
0
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))