def build_constraints(backend_model, model_data, constraint_definitions): for constraint_name, constraint_config in constraint_definitions.items(): subset = create_valid_subset(model_data, constraint_name, constraint_config) if subset is None: continue setattr( backend_model, f"{constraint_name}_constraint", po.Constraint( subset, rule=_load_rule_function(f"{constraint_name}_constraint_rule"), ), )
def build_variables(backend_model, model_data, variable_definitions): for var_name, var_config in variable_definitions.items(): subset = create_valid_subset(model_data, var_name, var_config) if subset is None: continue if "bounds" in var_config: kwargs = {"bounds": get_capacity_bounds(var_config.bounds)} else: kwargs = {} setattr( backend_model, var_name, po.Var(subset, domain=getattr(po, var_config.domain), **kwargs), )
def build_expressions(backend_model, model_data, expression_definitions): build_order_dict = { expr: config.get("build_order", 0) for expr, config in expression_definitions.items() } build_order = sorted(build_order_dict, key=build_order_dict.get) for expr_name in build_order: subset = create_valid_subset(model_data, expr_name, expression_definitions[expr_name]) if subset is None: continue expression_function = _load_rule_function( f"{expr_name}_expression_rule") if expression_function: kwargs = dict(rule=expression_function) else: kwargs = dict(initialize=0.0) setattr(backend_model, expr_name, po.Expression(subset, **kwargs))
def test_create_valid_subset(self, model_name): model = getattr(calliope.examples, model_name)() for object_type in ["constraints", "expressions"]: valid_subsets = { name: create_valid_subset(model._model_data, name, config) for name, config in subsets_config[object_type].items() } for name, subset in valid_subsets.items(): if subset is None: continue if "timesteps" in subset.names: subset = subset.droplevel("timesteps").unique() # FIXME: simplified comparison since constraint_sets.yaml isn't completely cleaned # up to match current representation of set elements assert len( constraint_sets[f"{model_name}.{object_type}.{name}"] ) == len(subset)