Source code for carbatpy.utils.read_cb_opti

# -*- coding: utf-8 -*-
"""
Script to read the content of a Carnot Battery Optimization directory

and do the CB calcultions with the optimal results and plot them.

Created on Fri Aug  8 16:07:33 2025

@author: atakan
Universität Duisburg-Essen, Germany

In the framework of the Priority Programme: "Carnot Batteries: Inverse Design from
Markets to Molecules" (SPP 2403)
https://www.uni-due.de/spp2403/
https://git.uni-due.de/spp-2403/residuals_weather_storage

"""

import numpy as np
import pandas as pd
import carbatpy as cb
from pathlib import Path
import yaml
import pickle

# === EINSTELLUNGEN ===
# Replace the results directory with the one wanted:
[docs] RES_DIR = Path(r"C:\Users\atakan\sciebo\results\2025-08-08-17-07-cb_opt_result") # Ordner vom ersten Skript
[docs] CSV_FILE = list(RES_DIR.glob("*cb_opti_res.csv"))[0] # nimmt automatisch die einzige CSV
[docs] YAML_FILE = RES_DIR / "config_bound.yaml"
[docs] PLOT = True # Plots speichern?
[docs] ALL_POP = False # True = alle Zeilen aus CSV berechnen, False = nur beste Lösung
# === DATEIEN LADEN === with open(YAML_FILE, "r") as f:
[docs] yaml_data = yaml.safe_load(f)
[docs] configs_m = yaml_data["configs"]
[docs] bounds_m = yaml_data["bounds"]
[docs] POWER_C = yaml_data["power_compressor"]
# io-Dateien
[docs] dir_names_both = { "hp": str(RES_DIR / "io-cycle-data.yaml"), "orc": str(RES_DIR / "io-orc-data.yaml"), }
# === Zuerst versuchen, saved paths zu laden ===
[docs] paths_file = RES_DIR / "paths.pkl"
if paths_file.exists(): with open(paths_file, "rb") as pf:
[docs] paths = pickle.load(pf)
print("Loaded 'paths' from paths.pkl") else: # Fallback: selbst erzeugen (verwende Deine Funktion) print("No 'paths.pkl' found — reconstructing paths from config/bounds (best-effort).") paths = {} for k in ["hp", "orc"]: _, _, p_list = cb.opti_cycle_comp_helpers.extract_optim_data_with_paths(configs_m[k], bounds_m[k]) paths[k] = p_list # === CSV lesen (Index-Spalte ausschließen) ===
[docs] df = pd.read_csv(CSV_FILE, index_col=0) # falls Optimierer index=False nimmt, ist das auch ok
[docs] energy_col = df.columns[-1]
[docs] x_cols = df.columns[:-1].tolist()
# === Sanity-check: Anzahl x in paths vs CSV ===
[docs] expected_len = sum(len(paths[k]) for k in ("hp", "orc"))
if expected_len != len(x_cols): raise RuntimeError( f"Mismatch between expected number of x-variables ({expected_len}) from 'paths' and CSV columns ({len(x_cols)}). " f"CSV columns (first 12): {x_cols[:12]}. Save 'paths.pkl' during optimization or check CSV writing." ) print(f"OK: expected_len={expected_len}, csv_x_cols={len(x_cols)}") # === calc-Funktion ===
[docs] def calc_from_row(row, idx): x_vals = row[x_cols].values.astype(float) co_n = cb.opti_cycle_comp_helpers.extract_cb_conf_from_x(x_vals, configs_m, paths) rte, res_ = cb.cb_comp.cb_calc(dir_names_both, POWER_C, config=co_n, plotting=PLOT) if PLOT: for key in res_: file_fig = RES_DIR / f"recalc_{idx}_{key}.png" res_[key]["figure"].savefig(file_fig) return rte
# === Auswahl === if ALL_POP:
[docs] results = []
for i, row in df.iterrows(): rte_val = calc_from_row(row, i) results.append((i, rte_val)) print("Alle Ergebnisse neu berechnet:", results) else: best_idx = df[energy_col].idxmin() rte_val = calc_from_row(df.loc[best_idx], best_idx) print(f"Beste Lösung neu berechnet (Index {best_idx}): RTE = {rte_val}")