Example notebook

[1]:
import matplotlib.pyplot as plt

from pommes import test_case_path
from pommes.io.build_input_dataset import (
    build_input_parameters,
    read_config_file,
)
from pommes.io.save_solution import save_solution
from pommes.model.build_model import build_model
from pommes.model.data_validation.dataset_check import check_inputs
[2]:
scenario = "ref"
suffix = "_02161113"

output_folder = f"{test_case_path}/output/{scenario}{suffix}"
solver = "highs"  # ["gurobi", "xpress", "highs", "mosek"]
[3]:
config = read_config_file(file_path=test_case_path / "config.yaml")

model_parameters = build_input_parameters(config)
model_parameters = check_inputs(model_parameters)
WARNING:root:Missing variables in input dataset. Adding defaults:
storage_energy_to_power_ratio: nan (type=float64)
[4]:
model = build_model(model_parameters)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[4], line 1
----> 1 model = build_model(model_parameters)

File /opt/conda/lib/python3.13/site-packages/pommes/model/build_model.py:94, in build_model(model_parameters)
     88 p = model_parameters
     90 operation_year_normalization = (
     91     p.operation_year_duration / p.time_step_duration.sum("hour")
     92 )
---> 94 m = Model()
     96 # ------------
     97 # Variables
     98 # ------------
     99
    100 # Operation - load_shedding & spillage
    102 operation_load_shedding_power = m.add_variables(
    103     name="operation_load_shedding_power",
    104     lower=0,
   (...)    109     coords=[p.area, p.hour, p.resource, p.year_op],
    110 )

File /opt/conda/lib/python3.13/site-packages/linopy/model.py:181, in Model.__init__(self, solver_dir, chunk, force_dim_names, auto_mask)
    179 self._variables: Variables = Variables({}, model=self)
    180 self._constraints: Constraints = Constraints({}, model=self)
--> 181 self._objective: Objective = Objective(LinearExpression(None, self), self)
    182 self._parameters: Dataset = Dataset()
    184 self._status: str = "initialized"

File /opt/conda/lib/python3.13/site-packages/linopy/expressions.py:384, in BaseExpression.__init__(self, data, model)
    381 data = assign_multiindex_safe(data, **coeffs_vars_dict)
    383 # transpose with new Dataset to really ensure correct order
--> 384 data = Dataset(data.transpose(..., TERM_DIM))
    386 # ensure helper dimensions are not set as coordinates
    387 if drop_dims := set(HELPER_DIMS).intersection(data.coords):
    388     # TODO: add a warning here, routines should be safe against this

File /opt/conda/lib/python3.13/site-packages/xarray/core/dataset.py:389, in Dataset.__init__(self, data_vars, coords, attrs)
    385     ) -> None:
    386         if data_vars is None:
    387             data_vars = {}
    388         if isinstance(data_vars, Dataset):
--> 389             raise TypeError(
    390                 "Passing a Dataset as `data_vars` to the Dataset constructor is"
    391                 " not supported. Use `ds.copy()` to create a copy of a Dataset."
    392             )

TypeError: Passing a Dataset as `data_vars` to the Dataset constructor is not supported. Use `ds.copy()` to create a copy of a Dataset.
[5]:
model.solve(solver_name=solver)

save_solution(
    model=model,
    output_folder=output_folder,
    model_parameters=model_parameters,
)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[5], line 1
----> 1 model.solve(solver_name=solver)
      2
      3 save_solution(
      4     model=model,

NameError: name 'model' is not defined
[6]:
solution = model.solution
print(model.solution)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[6], line 1
----> 1 solution = model.solution
      2 print(model.solution)

NameError: name 'model' is not defined
[7]:
dual = model.dual
print(dual)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[7], line 1
----> 1 dual = model.dual
      2 print(dual)

NameError: name 'model' is not defined
[8]:
prices = dual.operation_adequacy_constraint
df = prices.to_dataframe(name="value").reset_index()
print(df)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[8], line 1
----> 1 prices = dual.operation_adequacy_constraint
      2 df = prices.to_dataframe(name="value").reset_index()
      3 print(df)

NameError: name 'dual' is not defined
[9]:
unique_resources = df["resource"].unique()
unique_years = df["year_op"].unique()
unique_areas = df["area"].unique()
colors = plt.cm.tab10(range(len(unique_areas)))
area_color_map = {area: colors[i] for i, area in enumerate(unique_areas)}

fig, axes = plt.subplots(
    len(unique_resources),
    len(unique_years),
    figsize=(15, 10),
    sharex=True,
    sharey="row",
)

for i, resource in enumerate(unique_resources):
    for j, year in enumerate(unique_years):
        ax = axes[i, j]
        subset = df[(df["resource"] == resource) & (df["year_op"] == year)]

        for area in unique_areas:
            area_data = subset[subset["area"] == area]
            if not area_data.empty:
                ax.plot(
                    area_data["hour"],
                    area_data["value"],
                    marker="o",
                    color=area_color_map[area],
                )
        if i == 0:
            ax.set_title(f"Year: {year}")
        if j == 0:
            ax.set_ylabel(f"Resource: {resource}")
        if i == len(unique_resources) - 1:
            ax.set_xlabel("Hour")

legend_elements = [
    plt.Line2D(
        [0],
        [0],
        marker="o",
        color=color,
        linestyle="",
        markersize=8,
        label=area,
    )
    for area, color in area_color_map.items()
]
fig.legend(
    handles=legend_elements,
    loc="upper center",
    ncol=len(unique_areas),
    title="Area",
)

plt.tight_layout(rect=(0, 0, 1, 0.95))
plt.show()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[9], line 1
----> 1 unique_resources = df["resource"].unique()
      2 unique_years = df["year_op"].unique()
      3 unique_areas = df["area"].unique()
      4 colors = plt.cm.tab10(range(len(unique_areas)))

NameError: name 'df' is not defined
[ ]: