def rerun_pyomo_model(model_data, backend_model): """ Rerun the Pyomo backend, perhaps after updating a parameter value, (de)activating a constraint/objective or updating run options in the model model_data object (e.g. `run.solver`). Returns ------- run_data : xarray.Dataset Raw data from this rerun, including both inputs and results. to filter inputs/results, use `run_data.filter_by_attrs(is_result=...)` with 0 for inputs and 1 for results. """ backend_model.__calliope_run_config = AttrDict.from_yaml_string(model_data.attrs['run_config']) if backend_model.__calliope_run_config['mode'] != 'plan': raise exceptions.ModelError( 'Cannot rerun the backend in {} run mode. Only `plan` mode is ' 'possible.'.format(backend_model.__calliope_run_config['mode']) ) timings = {} log_time(logger, timings, 'model_creation') results, backend_model = backend_run.run_plan( model_data, timings, run_pyomo, build_only=False, backend_rerun=backend_model ) for k, v in timings.items(): results.attrs['timings.' + k] = v exceptions.ModelWarning( 'model.results will only be updated on running the model from ' '`model.run()`. We provide results of this rerun as a standalone xarray ' 'Dataset' ) results.attrs.update(model_data.attrs) for key, var in results.data_vars.items(): var.attrs['is_result'] = 1 inputs = access_pyomo_model_inputs(backend_model) for key, var in inputs.data_vars.items(): var.attrs['is_result'] = 0 results.update(inputs) run_data = results return run_data
def rerun_pyomo_model(model_data, backend_model): """ Rerun the Pyomo backend, perhaps after updating a parameter value, (de)activating a constraint/objective or updating run options in the model model_data object (e.g. `run.solver`). Returns ------- run_data : xarray.Dataset Raw data from this rerun, including both inputs and results. to filter inputs/results, use `run_data.filter_by_attrs(is_result=...)` with 0 for inputs and 1 for results. """ if model_data.attrs['run.mode'] != 'plan': raise exceptions.ModelError( 'Cannot rerun the backend in {} run mode. Only `plan` mode is ' 'possible.'.format(model_data.attrs['run.mode']) ) timings = {} log_time(timings, 'model_creation') results, backend_model = backend_run.run_plan( model_data, timings, run_pyomo, build_only=False, backend_rerun=backend_model ) for k, v in timings.items(): results.attrs['timings.' + k] = v exceptions.ModelWarning( 'model.results will only be updated on running the model from ' '`model.run()`. We provide results of this rerun as a standalone xarray ' 'Dataset' ) results.attrs.update(model_data.attrs) for key, var in results.data_vars.items(): var.attrs['is_result'] = 1 inputs = access_pyomo_model_inputs(backend_model) for key, var in inputs.data_vars.items(): var.attrs['is_result'] = 0 results.update(inputs) run_data = results return run_data
def rerun_pyomo_model(model_data, run_config, backend_model): """ Rerun the Pyomo backend, perhaps after updating a parameter value, (de)activating a constraint/objective or updating run options in the model model_data object (e.g. `run.solver`). Returns ------- new_model : calliope.Model New calliope model, including both inputs and results, but no backend interface. """ backend_model.__calliope_run_config = run_config if run_config["mode"] != "plan": raise exceptions.ModelError( "Cannot rerun the backend in {} run mode. Only `plan` mode is " "possible.".format(run_config["mode"])) timings = {} log_time(logger, timings, "model_creation") results, backend_model = backend_run.run_plan( model_data, run_config, timings, run_pyomo, build_only=False, backend_rerun=backend_model, ) inputs = access_pyomo_model_inputs(backend_model) # Add additional post-processed result variables to results if results.attrs.get("termination_condition", None) in ["optimal", "feasible"]: results = postprocess_model_results(results, model_data.reindex(results.coords), timings) for key, var in results.data_vars.items(): var.attrs["is_result"] = 1 for key, var in inputs.data_vars.items(): var.attrs["is_result"] = 0 new_model_data = xr.merge((results, inputs)) new_model_data.attrs.update(model_data.attrs) new_model_data.attrs.update(results.attrs) # Only add coordinates from the original model_data that don't already exist new_coords = [ i for i in model_data.coords.keys() if i not in new_model_data.coords.keys() ] new_model_data = new_model_data.update(model_data[new_coords]) # Reorganise the coordinates so that model data and new model data share # the same order of items in each dimension new_model_data = new_model_data.reindex(model_data.coords) exceptions.warn( "The results of rerunning the backend model are only available within " "the Calliope model returned by this function call.") new_calliope_model = calliope.Model(config=None, model_data=new_model_data) new_calliope_model._timings = timings return new_calliope_model