Source code for digital_comms.fixed_network.interventions

"""

Decide on interventions

"""
import math

[docs]def get_all_assets_ranked(system, technology, roll_out, percentile): """ Specifically obtain and rank exchanges by technology and policy. Parameters ---------- distributions : list of digital_comms.fixed_network.model.Distribution A list of distribution points technology : str The current technology being deployed. reverse_value : bool Used as an argument in 'sorted' to rank how assets will be deployed. Returns ------- list_of_objects Returns desired assets ranked based on technology benefit-cost ratio and reverse_value preference. """ if roll_out == 'insideout': handle = '{}_unserved'.format(technology) all_assets = sorted( (exchange for exchange in system._exchanges \ if getattr(exchange, technology) != exchange.total_prems), key=lambda item: getattr(item, handle), reverse=True) elif roll_out == 'rural': handle = '{}_unserved'.format(technology) all_assets = sorted( (exchange for exchange in system._exchanges \ if getattr(exchange, technology) != exchange.total_prems), key=lambda item: getattr(item, handle), reverse=False) elif roll_out == 'outsidein': handle = '{}_unserved'.format(technology) all_assets = sorted( (exchange for exchange in system._exchanges \ if getattr(exchange, technology) != exchange.total_prems), key=lambda item: getattr(item, handle), reverse=False) else: raise ValueError('Did not recognise ranking preference variable') cutoff = math.floor(len(all_assets) * percentile) assets = all_assets[cutoff:] return assets
[docs]def decide_interventions(system, technology, policy, parameters): """ ??? """ built_interventions = [] upgraded_ids = [] premises_passed = 0 annual_budget = parameters['annual_budget'] roll_out = policy.split('_')[1] policy = policy.split('_')[0] if policy == 'market': assets = get_all_assets_ranked(system, technology, roll_out, 0) capital_investment_type= 'private' for asset in assets: if asset.id not in upgraded_ids: if asset.rollout_costs[technology] <= annual_budget: annual_budget -= asset.rollout_costs[technology] built_interventions.append( ( asset.id, technology, policy, capital_investment_type, asset.rollout_costs[technology], 0, 0, ) ) upgraded_ids.append(asset.id) premises_passed += asset.total_prems else: break elif policy == 'subsidy': capital_investment_type = 'private' assets = get_all_assets_ranked(system, technology, roll_out, 0) for asset in assets: if asset.id not in upgraded_ids: if asset.rollout_costs[technology] <= annual_budget: annual_budget -= asset.rollout_costs[technology] built_interventions.append( ( asset.id, technology, policy, capital_investment_type, asset.rollout_costs[technology], #total cost asset.rollout_costs[technology], #private sector spending 0, #subsidy ) ) upgraded_ids.append(asset.id) premises_passed += asset.total_prems else: break capital_investment_type = 'public_private' percentile = parameters['subsidy_{}_percentile'.format(roll_out)] max_market_investment_per_dwelling = parameters['max_market_investment_per_dwelling'] annual_subsidy = parameters['annual_subsidy'] market_match_funding = parameters['market_match_funding'] subsidised_assets = get_all_assets_ranked(system, technology, roll_out, percentile) for asset in subsidised_assets: if asset.id not in upgraded_ids: handle = '{}_unserved'.format(technology) dwellings_to_upgrade = getattr(asset, handle) total_private_investment = round(dwellings_to_upgrade * max_market_investment_per_dwelling) total_upgrade_cost = asset.rollout_costs[technology] if total_upgrade_cost <= total_private_investment: total_subsidy = 0 else: total_subsidy = round(total_upgrade_cost - total_private_investment) if total_subsidy <= annual_subsidy: annual_subsidy -= total_subsidy market_match_funding -= total_private_investment built_interventions.append( ( asset.id, technology, policy, capital_investment_type, total_upgrade_cost, #total cost total_private_investment, #private sector spending total_subsidy, #subsidy ) ) upgraded_ids.append(asset.id) else: break else: raise ValueError('Did not recognise stipulated policy') return built_interventions