def test_simple_graph(self, get_sector_model): regions = Mock() regions.name = 'test_regions' intervals = Mock() intervals.name = 'test_intervals' SectorModel = get_sector_model elec_scenario = ScenarioModel('scenario') elec_scenario.add_output('output', regions, intervals, 'unit') energy_model = SectorModel('model') energy_model.add_input('input', regions, intervals, 'unit') energy_model.add_dependency(elec_scenario, 'output', 'input') sos_model = SosModel('energy_sos_model') sos_model.add_model(energy_model) sos_model.add_model(elec_scenario) # Builds the dependency graph sos_model.check_dependencies() graph = sos_model.dependency_graph assert energy_model in graph assert elec_scenario in graph assert list(graph.edges()) == [(elec_scenario, energy_model)]
def test_get_model_sets(self, get_sector_model): regions = Mock() regions.name = 'test_regions' intervals = Mock() intervals.name = 'test_intervals' elec_scenario = ScenarioModel('scenario') elec_scenario.add_output('output', regions, intervals, 'unit') SectorModel = get_sector_model energy_model = SectorModel('model') energy_model.add_input('input', regions, intervals, 'unit') energy_model.add_dependency(elec_scenario, 'output', 'input') sos_model = SosModel('energy_sos_model') sos_model.add_model(energy_model) sos_model.add_model(elec_scenario) sos_model.check_dependencies() actual = sos_model._get_model_sets_in_run_order() expected = ['scenario', 'model'] for model, name in zip(actual, expected): assert model.name == name
def test_nested_graph(self, get_sector_model): """If we add a nested model, all Sectormodel and ScenarioModel objects are added as nodes in the graph with edges along dependencies. SosModel objects are not included, as they are just containers for the SectorModel and ScenarioModel objects, passing up inputs for deferred linkages to dependencies. Not implemented yet: """ SectorModel = get_sector_model energy_model = SectorModel('energy_sector_model') input_metadata = { 'name': 'electricity_demand_input', 'spatial_resolution': Mock(), 'temporal_resolution': Mock(), 'units': 'unit' } energy_model._model_inputs = MetadataSet([input_metadata]) sos_model_lo = SosModel('lower') sos_model_lo.add_model(energy_model) sos_model_high = SosModel('higher') sos_model_high.add_model(sos_model_lo) with raises(NotImplementedError): sos_model_high.check_dependencies() graph = sos_model_high.dependency_graph assert graph.edges() == [] expected = networkx.DiGraph() expected.add_node(sos_model_lo) expected.add_node(energy_model) assert energy_model in graph.nodes() scenario = ScenarioModel('electricity_demand') scenario.add_output('elec_demand_output', Mock(), Mock(), 'kWh') sos_model_high.add_dependency(scenario, 'elec_demand_output', 'electricity_demand_input') sos_model_high.check_dependencies() assert graph.edges() == [(scenario, sos_model_high)]
def test_loop(self, get_energy_sector_model, get_water_sector_model): """Fails because no functionality to deal with loops """ energy_model = get_energy_sector_model water_model = get_water_sector_model sos_model = SosModel('energy_water_model') water_model.add_dependency(energy_model, 'fluffiness', 'fluffyness') energy_model.add_dependency(water_model, 'electricity_demand', 'electricity_demand_input') sos_model.add_model(water_model) sos_model.add_model(energy_model) assert energy_model.model_inputs.names == ['electricity_demand_input'] assert water_model.model_inputs.names == ['fluffyness'] assert sos_model.model_inputs.names == [] assert energy_model.free_inputs.names == [] assert water_model.free_inputs.names == [] assert sos_model.free_inputs.names == [] sos_model.check_dependencies() graph = sos_model.dependency_graph assert (water_model, energy_model) in graph.edges() assert (energy_model, water_model) in graph.edges() modelset = ModelSet([water_model, energy_model], sos_model) actual = modelset.guess_results(water_model, 2010, {}) expected = {'electricity_demand': np.array([1.])} # assert actual == expected sos_model.max_iterations = 100 results = sos_model.simulate(2010) expected = np.array([[0.13488114]], dtype=np.float) actual = results['energy_sector_model']['fluffiness'] np.testing.assert_allclose(actual, expected, rtol=1e-5) expected = np.array([[0.16469004]], dtype=np.float) actual = results['water_supply_model']['electricity_demand'] np.testing.assert_allclose(actual, expected, rtol=1e-5)
def test_topological_sort(self, get_sector_model): SectorModel = get_sector_model elec_scenario = ScenarioModel('scenario') elec_scenario.add_output('output', Mock(), Mock(), 'unit') elec_scenario.add_data(np.array([[[123]]]), [2010]) energy_model = SectorModel('model') energy_model.add_input('input', Mock(), Mock(), 'unit') energy_model.add_dependency(elec_scenario, 'output', 'input') sos_model = SosModel('energy_sos_model') sos_model.add_model(energy_model) sos_model.add_model(elec_scenario) sos_model.check_dependencies() graph = sos_model.dependency_graph actual = networkx.topological_sort(graph, reverse=False) assert actual == [elec_scenario, energy_model]
def test_loop(self, get_energy_sector_model, get_water_sector_model): """Fails because no functionality to deal with loops """ energy_model = get_energy_sector_model water_model = get_water_sector_model sos_model = SosModel('energy_water_model') water_model.add_dependency(energy_model, 'fluffiness', 'fluffyness') energy_model.add_dependency(water_model, 'electricity_demand', 'electricity_demand_input') sos_model.add_model(water_model) sos_model.add_model(energy_model) assert energy_model.inputs.names == ['electricity_demand_input'] assert water_model.inputs.names == ['fluffyness'] assert sos_model.inputs.names == [] assert energy_model.free_inputs.names == [] assert water_model.free_inputs.names == [] assert sos_model.free_inputs.names == [] sos_model.check_dependencies() graph = sos_model.dependency_graph assert (water_model, energy_model) in graph.edges() assert (energy_model, water_model) in graph.edges() sos_model.max_iterations = 100 data_handle = get_data_handle(sos_model) results = sos_model.simulate(data_handle) expected = np.array([[0.13488114]], dtype=np.float) actual = results.get_results('fluffiness', model_name='energy_sector_model', modelset_iteration=35) np.testing.assert_allclose(actual, expected, rtol=1e-5) expected = np.array([[0.16469004]], dtype=np.float) actual = results.get_results('electricity_demand', model_name='water_supply_model', modelset_iteration=35) np.testing.assert_allclose(actual, expected, rtol=1e-5)
def test_topological_sort(self, get_sector_model): regions = Mock() regions.name = 'test_regions' intervals = Mock() intervals.name = 'test_intervals' SectorModel = get_sector_model elec_scenario = ScenarioModel('scenario') elec_scenario.add_output('output', regions, intervals, 'unit') energy_model = SectorModel('model') energy_model.add_input('input', regions, intervals, 'unit') energy_model.add_dependency(elec_scenario, 'output', 'input') sos_model = SosModel('energy_sos_model') sos_model.add_model(energy_model) sos_model.add_model(elec_scenario) sos_model.check_dependencies() graph = sos_model.dependency_graph actual = list(networkx.topological_sort(graph)) assert actual == [elec_scenario, energy_model]
def test_get_model_sets(self, get_sector_model): SectorModel = get_sector_model elec_scenario = ScenarioModel('scenario') elec_scenario.add_output('output', Mock(), Mock(), 'unit') elec_scenario.add_data(np.array([[[123]]]), [2010]) energy_model = SectorModel('model') energy_model.add_input('input', Mock(), Mock(), 'unit') energy_model.add_dependency(elec_scenario, 'output', 'input') sos_model = SosModel('energy_sos_model') sos_model.add_model(energy_model) sos_model.add_model(elec_scenario) sos_model.check_dependencies() actual = sos_model._get_model_sets_in_run_order() expected = ['scenario', 'model'] for model, name in zip(actual, expected): assert model.name == name
def test_simple_graph(self, get_sector_model): SectorModel = get_sector_model elec_scenario = ScenarioModel('scenario') elec_scenario.add_output('output', Mock(), Mock(), 'unit') elec_scenario.add_data(np.array([[[123]]]), [2010]) energy_model = SectorModel('model') energy_model.add_input('input', Mock(), Mock(), 'unit') energy_model.add_dependency(elec_scenario, 'output', 'input') sos_model = SosModel('energy_sos_model') sos_model.add_model(energy_model) sos_model.add_model(elec_scenario) # Builds the dependency graph sos_model.check_dependencies() graph = sos_model.dependency_graph assert energy_model in graph assert elec_scenario in graph assert graph.edges() == [(elec_scenario, energy_model)]