Source code for smif.controller.build

import logging
import os
import sys
import traceback

from smif.controller.modelrun import ModelRun
from smif.exception import SmifDataNotFoundError
from smif.model import ScenarioModel, SectorModel, SosModel


[docs]def get_model_run_definition(store, modelrun): """Builds the model run Arguments --------- store : ~smif.data_layer.store.Store Path to the project directory modelrun : str Name of the model run to run Returns ------- dict The complete model_run configuration dictionary with contained ScenarioModel, SosModel and SectorModel objects """ try: model_run_config = store.read_model_run(modelrun) except SmifDataNotFoundError: logging.error( "Model run %s not found. Run 'smif list' to see available model runs.", modelrun, ) exit(-1) logging.info("Running %s", model_run_config["name"]) logging.debug("Model Run: %s", model_run_config) sos_model_config = store.read_sos_model(model_run_config["sos_model"]) sector_models = get_sector_models(sos_model_config["sector_models"], store) logging.debug("Sector models: %s", sector_models) scenario_models = get_scenario_models(model_run_config["scenarios"], store) logging.debug("Scenario models: %s", [model.name for model in scenario_models]) sos_model = SosModel.from_dict(sos_model_config, sector_models + scenario_models) model_run_config["sos_model"] = sos_model logging.debug("Model list: %s", list(model.name for model in sos_model.models)) model_run_config["strategies"] = store.read_strategies(model_run_config["name"]) logging.debug("Strategies: %s", [s["type"] for s in model_run_config["strategies"]]) return model_run_config
[docs]def get_scenario_models(scenarios, handler): """Read in ScenarioModels Arguments --------- scenarios : dict handler : smif.data_layer.Store Returns ------- list of ScenarioModel """ scenario_models = [] for scenario_name, variant_name in scenarios.items(): scenario_definition = handler.read_scenario(scenario_name) # assign variant name to definition scenario_definition["scenario"] = variant_name # rename provides => outputs scenario_definition["outputs"] = scenario_definition["provides"] del scenario_definition["provides"] logging.debug("Scenario definition: %s", scenario_name) scenario_model = ScenarioModel.from_dict(scenario_definition) scenario_models.append(scenario_model) return scenario_models
[docs]def get_sector_models(sector_model_names, handler): """Read and build SectorModels Arguments --------- sector_model_names : list of str handler : smif.data_layer.Store Returns ------- list of SectorModel implementations """ sector_models = [] for sector_model_name in sector_model_names: sector_model_config = handler.read_model(sector_model_name) # absolute path to be crystal clear for ModelLoader when loading python class sector_model_config["path"] = os.path.normpath( os.path.join(handler.model_base_folder, sector_model_config["path"]) ) sector_model = SectorModel.from_dict(sector_model_config) sector_models.append(sector_model) return sector_models
[docs]def build_model_run(model_run_config): """Builds the model run Arguments --------- model_run_config: dict A valid model run configuration dict with objects Returns ------- `smif.controller.modelrun.ModelRun` """ logger = logging.getLogger() try: logger.profiling_start("build_model_run", model_run_config["name"]) except AttributeError: logger.info("build_model_run %s", model_run_config["name"]) try: model_run = ModelRun.from_dict(model_run_config) except AssertionError as error: err_type, err_value, err_traceback = sys.exc_info() traceback.print_exception(err_type, err_value, err_traceback) err_msg = str(error) if err_msg: logger.error("An AssertionError occurred (%s) see details above.", err_msg) else: logger.error("An AssertionError occurred, see details above.") exit(-1) try: logger.profiling_stop("build_model_run", model_run_config["name"]) except AttributeError: logger.info("build_model_run %s", model_run_config["name"]) return model_run