def test_ActivityPolicy_verifies_for_appropriate_probabilities(mocker): mocker.patch.object(probability_samplers, 'verify_probability') policies.ActivityPolicy(modifiers.RemoveActivity(['']), 0.5) probability_samplers.verify_probability.assert_called_once_with( 0.5, (probability_samplers.HouseholdProbability, probability_samplers.PersonProbability))
def test_attribute_based_remove_activity_policy_does_not_remove_matching_activities_from_non_strictly_irrelevant_people( home_education_home_university_student): household = instantiate_household_with( [home_education_home_university_student]) def age_condition_under_0(attribute_value): return attribute_value < 0 def job_condition_wasevrrr(attribute_value): return attribute_value == 'wasevrrr' assert_correct_activities( person=household.people['1'], ordered_activities_list=['home', 'education', 'home']) assert not age_condition_under_0(household.people['1'].attributes['age']) assert not job_condition_wasevrrr(household.people['1'].attributes['job']) policy_remove_higher_education = policies.ActivityPolicy( modifiers.RemoveActivity(['education']), probability_samplers.ActivityProbability(['education'], 1), filters.PersonAttributeFilter(conditions={ 'age': age_condition_under_0, 'job': job_condition_wasevrrr }, how='any')) policy_remove_higher_education.apply_to(household) assert_correct_activities( person=household.people['1'], ordered_activities_list=['home', 'education', 'home'])
def test_attribute_based_remove_activity_policy_removes_all_matching_activities_from_strictly_relevant_people( home_education_home_university_student): household = instantiate_household_with( [home_education_home_university_student]) def age_condition_over_17(attribute_value): return attribute_value > 17 def job_condition_education(attribute_value): return attribute_value == 'education' assert_correct_activities( person=household.people[1], ordered_activities_list=['home', 'education', 'home']) assert age_condition_over_17(household.people[1].attributes['age']) assert job_condition_education(household.people[1].attributes['job']) policy_remove_higher_education = policies.ActivityPolicy( modifiers.RemoveActivity(['education']), probability_samplers.ActivityProbability(['education'], 1), filters.PersonAttributeFilter(conditions={ 'age': age_condition_over_17, 'job': job_condition_education }, how='all')) policy_remove_higher_education.apply_to(household) assert_correct_activities(person=household.people[1], ordered_activities_list=['home'])
def test_ActivityPolicy_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.ActivityPolicy(modifiers.RemoveActivity(['work']), 0.5) household = SmithHousehold policy.apply_to(household) assert not modifiers.RemoveActivity.apply_to.called, 'method should not have been called'
def test_home_education_home_removal_of_education_act( person_home_education_home): household = instantiate_household_with([person_home_education_home]) assert_correct_activities( person=household.people['1'], ordered_activities_list=['home', 'education', 'home']) policy = policies.ActivityPolicy( modifiers.RemoveActivity(activities=['education']), 1) policy.apply_to(household) assert_correct_activities(person=household.people['1'], ordered_activities_list=['home'])
def test_ActivityPolicy_apply_to_delegates_to_modifier_policy_apply_to_for_list_of_probabilities( mocker, SmithHousehold): mocker.patch.object(modifiers.RemoveActivity, 'apply_to') mocker.patch.object(probability_samplers.SimpleProbability, 'p', return_value=1) policy = policies.ActivityPolicy(modifiers.RemoveActivity( ['']), [1., probability_samplers.SimpleProbability(1.)]) household = SmithHousehold policy.apply_to(household) assert modifiers.RemoveActivity.apply_to.call_count == 4
def test_ActivityPolicy_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.ActivityPolicy(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_evaluate_activity_policy_selects_steve_for_individual_activity_removal( mocker, SmithHousehold): mocker.patch.object(random, 'random', side_effect=[1] + [0] + [1] * 18) household = SmithHousehold steve = household.people['1'] hilda = household.people['2'] timmy = household.people['3'] bobby = household.people['4'] assert_correct_activities( person=steve, ordered_activities_list=['home', 'work', 'leisure', 'work', 'home']) assert_correct_activities(person=hilda, ordered_activities_list=[ 'home', 'escort_education', 'shop', 'leisure', 'escort_education', 'home' ]) assert_correct_activities(person=timmy, ordered_activities_list=[ 'home', 'education', 'shop', 'education', 'leisure', 'home' ]) assert_correct_activities( person=bobby, ordered_activities_list=['home', 'education', 'home']) # i.e. First of Steve's work activities is affected and only that activity is affected policy = policies.ActivityPolicy( modifiers.RemoveActivity( ['education', 'escort', 'leisure', 'shop', 'work']), probability_samplers.ActivityProbability( ['education', 'escort', 'leisure', 'shop', 'work'], 0.5)) policy.apply_to(household) assert_correct_activities( person=steve, ordered_activities_list=['home', 'leisure', 'work', 'home']) assert_correct_activities(person=hilda, ordered_activities_list=[ 'home', 'escort_education', 'shop', 'leisure', 'escort_education', 'home' ]) assert_correct_activities(person=timmy, ordered_activities_list=[ 'home', 'education', 'shop', 'education', 'leisure', 'home' ]) assert_correct_activities( person=bobby, ordered_activities_list=['home', 'education', 'home'])
def test_home_work_home_education_home_removal_of_education_act(): person = Person(1) person.add( Activity(seq=1, act='home', area='a', start_time=mtdt(0), end_time=mtdt(60))) person.add( Leg(seq=1, mode='car', start_area='a', end_area='b', start_time=mtdt(60), end_time=mtdt(90))) person.add( Activity(seq=2, act='work', area='b', start_time=mtdt(90), end_time=mtdt(120))) person.add( Leg(seq=2, mode='car', start_area='b', end_area='a', start_time=mtdt(120), end_time=mtdt(180))) person.add( Activity(seq=3, act='home', area='a', start_time=mtdt(180), end_time=mtdt(300))) person.add( Leg(seq=3, mode='car', start_area='a', end_area='b', start_time=mtdt(300), end_time=mtdt(390))) person.add( Activity(seq=2, act='education', area='b', start_time=mtdt(390), end_time=mtdt(520))) person.add( Leg(seq=2, mode='car', start_area='b', end_area='a', start_time=mtdt(520), end_time=mtdt(580))) person.add( Activity(seq=3, act='home', area='a', start_time=mtdt(680), end_time=END_OF_DAY)) household = instantiate_household_with([person]) assert_correct_activities( person=household.people['1'], ordered_activities_list=['home', 'work', 'home', 'education', 'home']) policy = policies.ActivityPolicy( modifiers.RemoveActivity(activities=['education']), 1) policy.apply_to(household) assert_correct_activities(person=household.people['1'], ordered_activities_list=['home', 'work', 'home'])