def test_budget(small_system_80): year = 2019 technology = 'fttp' policy = 's1_market_based_roll_out' annual_budget = 2000 adoption_cap = 40 subsidy = 1000 telco_match_funding = 1000 service_obligation_capacity = 10 expected_budget_constrained_interventions = [ ('distribution_{EACAM}{1}', 'fttp', 's1_market_based_roll_out', 'market_based', 30720.0, 1837, 16.72291780076211) ] #Total cost should be £1837 #fttp modem: £20 * 20 = £400 #optical network terminal: £10 * 20 = £200 #planning cost: £10 * 20 = £200 #optical connection point: £37 * 1 = £37 (32 premises per connection point) #fibre upgrade cost: £5 * 200 = 1000 #build interventions budget_constrained_interventions = decide_interventions( small_system_80._distributions, year, technology, policy, annual_budget, adoption_cap, subsidy, telco_match_funding, service_obligation_capacity, 'distribution') assert budget_constrained_interventions == expected_budget_constrained_interventions
def test_fttp_s1_from_cabinet(small_system_40): year = 2019 technology = 'fttp' policy = 's1_market_based_roll_out' annual_budget = 8000 adoption_cap = 70 subsidy = 2000 telco_match_funding = 2000 service_obligation_capacity = 10 fttp_s1_expected_built_interventions = [ ('cabinet_{EACAM}{P100}', 'fttp', 's1_market_based_roll_out', 'market_based', 49920.0, 7811, 6.390987069517347) ] #Total cost for exchange_EACOM should be: #cabinet = 1550 + #distribution = £1837 + £2087 + £2337 # == 7811 #build interventions fttp_s1_built_interventions = decide_interventions( small_system_40._cabinets, year, technology, policy, annual_budget, adoption_cap, subsidy, telco_match_funding, service_obligation_capacity, 'cabinet') assert fttp_s1_expected_built_interventions == fttp_s1_built_interventions
def test_fttdp_s1_from_exchange(small_system_40): year = 2019 technology = 'fttdp' policy = 's1_market_based_roll_out' annual_budget = 60000 adoption_cap = 80 subsidy = 2000 telco_match_funding = 2000 service_obligation_capacity = 10 fttdp_s1_expected_built_interventions = [ ('exchange_EACAM', 'fttdp', 's1_market_based_roll_out', 'market_based', 49920.0, 32450, 1.538366718027735), ] #Total cost should be £32400 #fttdp modem: £20 * 20 = £400 #costs_assets_distribution_fttdp_8_ports: £250 * 3 = £750 #fibre from cab to dist: £5 * (200+250+300) = £3750 #cabinet upgrade = £2500 #exchange upgrade = £25000 #build interventions fttdp_s1_built_interventions = decide_interventions( small_system_40._exchanges, year, technology, policy, annual_budget, adoption_cap, subsidy, telco_match_funding, service_obligation_capacity, 'exchange') assert fttdp_s1_built_interventions == fttdp_s1_expected_built_interventions
def test_fttp_s1_from_exchange(small_system_40): year = 2019 technology = 'fttp' policy = 's1_market_based_roll_out' annual_budget = 60000 adoption_cap = 70 subsidy = 2000 telco_match_funding = 2000 service_obligation_capacity = 10 fttp_s1_expected_built_interventions = [ ('exchange_EACAM', 'fttp', 's1_market_based_roll_out', 'market_based', 49920.0, 57811, 0.8635034854958399), #('exchange_EACOM', 'fttp', 's1_market_based_roll_out', 'market_based', 57474.0) ] #Total cost for exchange_EACAM should be: #exchange = £50000 + #cabinet = 1550 + #distribution = £1837 + £2087 + £2337 # == 57811 #build interventions fttp_s1_built_interventions = decide_interventions( small_system_40._exchanges, year, technology, policy, annual_budget, adoption_cap, subsidy, telco_match_funding, service_obligation_capacity, 'exchange') assert fttp_s1_built_interventions == fttp_s1_expected_built_interventions
def test_fttp_s1(small_system_40): year = 2019 technology = 'fttp' policy = 's1_market_based_roll_out' annual_budget = 3000 adoption_cap = 40 subsidy = 2000 telco_match_funding = 2000 service_obligation_capacity = 10 fttp_s1_expected_built_interventions = [ ('distribution_{EACAM}{2}', 'fttp', 's1_market_based_roll_out', 'market_based', 26880.0, 2087, 12.879731672256828) ] #Total cost for the distribution downwards should be £2087 #fttp modem: £20 * 20 = £400 #optical network terminal: £10 * 20 = £200 #planning cost: £10 * 20 = £200 #optical connection point: £37 * 1 = £37 (32 premises per connection point) #distribution point upgrade = £10 #fibre upgrade cost: £5 * 250 = 1250 #build interventions fttp_s1_built_interventions = decide_interventions( small_system_40._distributions, year, technology, policy, annual_budget, adoption_cap, subsidy, telco_match_funding, service_obligation_capacity, 'distribution') assert fttp_s1_built_interventions == fttp_s1_expected_built_interventions
def test_enhanced_fttp_capacity_at_exchange(small_system): year = 2019 technology = 'fttp' policy = 's1_market_based_roll_out' annual_budget = 10000000 adoption_cap = 40 subsidy = 2000 telco_match_funding = 2000 service_obligation_capacity = 10 #build interventions built_interventions = decide_interventions( small_system._exchanges, year, technology, policy, annual_budget, adoption_cap, subsidy, telco_match_funding, service_obligation_capacity, 'exchange') small_system.upgrade(built_interventions) expected_capacity = [{ 'id': 'exchange_EACAM', # fttp fttdp fttc docsis3 adsl # ((20*1000) + (0*300) + (5*80) + (5*150) + (0*24)) / 20 == round(69.5) 'average_capacity': 1000, }] actual_capacity = small_system.capacity('exchange') assert expected_capacity == actual_capacity
def test_fttdp_upgrade_distributions(small_system): year = 2019 technology = 'fttdp' policy = 's1_market_based_roll_out' annual_budget = 2000 adoption_cap = 40 subsidy = 2000 telco_match_funding = 2000 service_obligation_capacity = 10 # build interventions built_interventions = decide_interventions( small_system._distributions, year, technology, policy, annual_budget, adoption_cap, subsidy, telco_match_funding, service_obligation_capacity, 'distribution') small_system.upgrade(built_interventions) actual_coverage = small_system.coverage('exchange') expected_coverage = [{ 'id': 'exchange_EACAM', 'percentage_of_premises_with_fttp': 0, 'percentage_of_premises_with_fttdp': 100, 'percentage_of_premises_with_fttc': 0, 'percentage_of_premises_with_docsis3': 0, 'percentage_of_premises_with_adsl': 0, 'sum_of_premises': 20, }] assert expected_coverage == actual_coverage
def test_fttp_s3(small_system_40): year = 2019 technology = 'fttp' policy = 's3_outside_in_subsidy' annual_budget = 60000 adoption_cap = 80 subsidy = 30000 telco_match_funding = 30000 service_obligation_capacity = 10 fttp_s3_expected_built_interventions = [ ('exchange_EACAM', 'fttp', 's3_outside_in_subsidy', 'market_based', 49920.0, 57811, 0.8635034854958399), ('exchange_EACOM', 'fttp', 's3_outside_in_subsidy', 'subsidy_based', 0, 57474.0, 0.0), ] #Total cost should be £1837 #fttp modem: £20 * 20 = £400 #optical network terminal: £10 * 20 = £200 #planning cost: £10 * 20 = £200 #optical connection point: £37 * 1 = £37 (32 premises per connection point) #fibre upgrade cost: £5 * 200 = 1000 #Total cost should be 2837 #fttp modem: £20 * 20 = £400 #optical network terminal: £10 * 20 = £200 #planning cost: £10 * 20 = £200 #optical connection point: £37 * 1 = £37 (32 premises per connection point) #fibre upgrade cost: £5 * 400 = 2000 #build interventions fttp_s3_built_interventions = decide_interventions( small_system_40._exchanges, year, technology, policy, annual_budget, adoption_cap, subsidy, telco_match_funding, service_obligation_capacity, 'exchange') assert fttp_s3_built_interventions == fttp_s3_expected_built_interventions with pytest.raises(ValueError) as ex: decide_interventions( small_system_40._exchanges, year, technology, 'unknown_policy', annual_budget, adoption_cap, subsidy, telco_match_funding, service_obligation_capacity, 'exchange') msg = 'Did not recognise stipulated policy' assert msg in str(ex)
def test_fttp_s2_from_exchange(small_system_40): year = 2019 technology = 'fttp' policy = 's2_rural_based_subsidy' annual_budget = 60000 adoption_cap = 80 subsidy = 30000 telco_match_funding = 30000 service_obligation_capacity = 10 fttp_s2_expected_built_interventions = [ ('exchange_EACAM', 'fttp', 's2_rural_based_subsidy', 'market_based', 49920.0, 57811, 0.8635034854958399), ('exchange_EACOM', 'fttp', 's2_rural_based_subsidy', 'subsidy_based', 0, 57474.0, 0), ] #build interventions fttp_s2_built_interventions = decide_interventions( small_system_40._exchanges, year, technology, policy, annual_budget, adoption_cap, subsidy, telco_match_funding, service_obligation_capacity, 'exchange') print(fttp_s2_built_interventions) assert fttp_s2_built_interventions == fttp_s2_expected_built_interventions
def test_decide_interventions(base_system, parameters, constrained_parameters): built_interventions = decide_interventions(base_system, 'fttdp', 'market_insideout', parameters) built_intervention_ids = [i[0] for i in built_interventions] expected_intervention_ids = ['A', 'B', 'C', 'D'] assert built_intervention_ids == expected_intervention_ids built_interventions = decide_interventions(base_system, 'fttdp', 'subsidy_rural', parameters) built_intervention_ids = [i[0] for i in built_interventions] expected_intervention_ids = ['D', 'C', 'B', 'A'] assert built_intervention_ids == expected_intervention_ids built_interventions = decide_interventions(base_system, 'fttdp', 'subsidy_outsidein', parameters) built_intervention_ids = [i[0] for i in built_interventions] expected_intervention_ids = ['D', 'C', 'B', 'A'] assert built_intervention_ids == expected_intervention_ids built_interventions = decide_interventions(base_system, 'fttdp', 'market_insideout', constrained_parameters) #asset_id, tech, policy, capital_investment_type, total_cost, private_sector_spend, subsidy expected_interventions = [('A', 'fttdp', 'market', 'private', 50000, 0, 0), ('B', 'fttdp', 'market', 'private', 50000, 0, 0)] assert built_interventions == expected_interventions built_interventions = decide_interventions(base_system, 'fttp', 'market_insideout', constrained_parameters) expected_interventions = [('A', 'fttp', 'market', 'private', 100000, 0, 0)] assert built_interventions == expected_interventions built_interventions = decide_interventions(base_system, 'fttdp', 'subsidy_rural', constrained_parameters) expected_interventions = [ ('D', 'fttdp', 'subsidy', 'private', 50000, 50000, 0), ('C', 'fttdp', 'subsidy', 'private', 50000, 50000, 0), ('B', 'fttdp', 'subsidy', 'public_private', 50000, 8000, 42000), ('A', 'fttdp', 'subsidy', 'public_private', 50000, 9000, 41000) ] assert built_interventions == expected_interventions built_interventions = decide_interventions(base_system, 'fttp', 'subsidy_rural', constrained_parameters) expected_interventions = [ ('D', 'fttp', 'subsidy', 'private', 100000, 100000, 0), ('B', 'fttp', 'subsidy', 'public_private', 100000, 8000, 92000), ('A', 'fttp', 'subsidy', 'public_private', 100000, 9000, 91000) ] assert built_interventions == expected_interventions built_interventions = decide_interventions(base_system, 'fttdp', 'subsidy_outsidein', constrained_parameters) expected_interventions = [ ('D', 'fttdp', 'subsidy', 'private', 50000, 50000, 0), ('C', 'fttdp', 'subsidy', 'private', 50000, 50000, 0), ('B', 'fttdp', 'subsidy', 'public_private', 50000, 8000, 42000), ('A', 'fttdp', 'subsidy', 'public_private', 50000, 9000, 41000) ] assert built_interventions == expected_interventions built_interventions = decide_interventions(base_system, 'fttp', 'subsidy_outsidein', constrained_parameters) expected_interventions = [ ('D', 'fttp', 'subsidy', 'private', 100000, 100000, 0), ('C', 'fttp', 'subsidy', 'public_private', 100000, 7000, 93000), ('B', 'fttp', 'subsidy', 'public_private', 100000, 8000, 92000), ('A', 'fttp', 'subsidy', 'public_private', 100000, 9000, 91000) ] assert built_interventions == expected_interventions
for year in TIMESTEPS: print('Processing {}'.format(year)) lads = dwelling_density_by_lad(lads, dwellings, year) #THIS DOES NOT CORRECTLY ALLOCATE - NEED TO GENERATE EX TO LAD LUT exchanges = estimate_dwelling_density(exchanges, lads) # Simulate first year if year == BASE_YEAR: system = NetworkManager(exchanges, parameters) # actually decide which interventions to build built_interventions = decide_interventions(system, technology, policy, parameters) # give the interventions to the system model system.upgrade(built_interventions) # write out the decisions path = os.path.join(RESULTS_DIRECTORY, 'fixed_outputs') write_decisions(built_interventions, path, year, technology, policy) write_spend(built_interventions, path, year, technology, policy) write_exchange_results(system, path, year, technology, policy) # # write_lad_results(system, exchange_to_lad_lut, path, year, technology, policy, roll_out)