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