def generate_model_run(config, debug_comments, applied_overrides, scenario): """ Returns a processed model_run configuration AttrDict and a debug YAML object with comments attached, ready to write to disk. Parameters ---------- config : AttrDict debug_comments : AttrDict """ model_run = AttrDict() model_run['scenario'] = scenario model_run['applied_overrides'] = ';'.join(applied_overrides) # 1) Initial checks on model configuration warnings, errors = checks.check_initial(config) exceptions.print_warnings_and_raise_errors(warnings=warnings, errors=errors) # 2) Fully populate techs # Raises ModelError if necessary model_run['techs'], debug_techs, errors = process_techs(config) debug_comments.set_key('model_run.techs', debug_techs) exceptions.print_warnings_and_raise_errors(errors=errors) # 3) Fully populate tech_groups model_run['tech_groups'] = process_tech_groups(config, model_run['techs']) # 4) Fully populate locations model_run['locations'], debug_locs, warnings, errors = locations.process_locations( config, model_run['techs'] ) debug_comments.set_key('model_run.locations', debug_locs) exceptions.print_warnings_and_raise_errors(warnings=warnings, errors=errors) # 5) Fully populate timeseries data # Raises ModelErrors if there are problems with timeseries data at this stage model_run['timeseries_data'], model_run['timesteps'] = ( process_timeseries_data(config, model_run) ) # 6) Grab additional relevant bits from run and model config model_run['run'] = config['run'] model_run['model'] = config['model'] # 7) Initialize sets all_sets = sets.generate_simple_sets(model_run) all_sets.union(sets.generate_loc_tech_sets(model_run, all_sets)) all_sets = AttrDict({k: list(v) for k, v in all_sets.items()}) model_run['sets'] = all_sets model_run['constraint_sets'] = constraint_sets.generate_constraint_sets(model_run) # 8) Final sense-checking final_check_comments, warnings, errors = checks.check_final(model_run) debug_comments.union(final_check_comments) exceptions.print_warnings_and_raise_errors(warnings=warnings, errors=errors) # 9) Build a debug data dict with comments and the original configs debug_data = AttrDict({ 'comments': debug_comments, 'config_initial': config, }) return model_run, debug_data