ReEDS → Sienna

Cloning the necessary packages for each translation is important.

Setup

uv sync --upgrade
uv add --editable /path/to/r2x-reeds
uv add --editable /path/to/r2x-sienna

Example Script

import json
from importlib.resources import files
from pathlib import Path
from typing import cast

from infrasys.time_series_manager import TimeSeriesManager
from infrasys.time_series_models import TimeSeriesStorageType
from infrasys.utils.sqlite import create_in_memory_db
from r2x_reeds import ReEDSConfig, ReEDSParser
from r2x_reeds_to_sienna.getter_utils import add_generator_emissions
from r2x_sienna.exporter import SiennaExporter
from r2x_sienna.plugin_config import SiennaConfig

from r2x_core import DataStore, PluginContext, Rule, System, apply_rules_to_context  # type: ignore
from r2x_core.logger import setup_logging  # type: ignore

setup_logging(verbosity=2)

case_name = "reeds_run_folder_name"
base_path = "/Users/mvelasqu/Documents/marck/GDO/test-r2x-translations/reeds-to-sienna"
run_path = Path(base_path) / case_name

# =====================================
# ReEDS PARSER
# =====================================
solve_year = 2035
weather_year = 2012
scenario = "base"
reeds_config = ReEDSConfig(
    solve_year=solve_year,
    weather_year=weather_year,
    case_name=case_name,
    scenario=scenario,
    models=("r2x_reeds.models", "r2x_sienna.models"),
)

store = DataStore.from_plugin_config(reeds_config, path=run_path)
context = PluginContext(config=reeds_config, store=store)

parser = cast(ReEDSParser, ReEDSParser.from_context(context))
reeds_sys = parser.run()
reeds_sys = reeds_sys.system
context.source_system = reeds_sys
# breakpoint()
tmp_dir = reeds_sys.get_time_series_directory()

reeds_sys.convert_storage(
    time_series_directory=tmp_dir,
    time_series_storage_type=TimeSeriesStorageType.ARROW,
    permanent=True,
)

# =====================================
# Rules Definition
# =====================================
rules_path = files("r2x_reeds_to_sienna.config") / "rules.json"
rules = Rule.from_records(json.loads(rules_path.read_text()))
context.rules = rules

# =====================================
# ReEDS to Sienna (TRANSLATION)
# =====================================
connection = create_in_memory_db()
ts_manager = TimeSeriesManager(
    connection,
    time_series_directory=tmp_dir,
    time_series_storage_type=TimeSeriesStorageType.ARROW,
    permanent=True
)

sienna_sys = System(
    name="Sienna",
    auto_add_composed_components=True,
    time_series_manager=ts_manager,
    system_base=100.0,
)
context.target_system = sienna_sys
apply_rules_to_context(context)
add_generator_emissions(context)

# =====================================
# Sienna Exporter
# =====================================
results_dir = Path(base_path) / f"{case_name}_results"
results_dir.mkdir(exist_ok=True)

exported_system = f"{case_name}.json"
output_file = results_dir / exported_system
sienna_config = SiennaConfig(
    model_year=solve_year,
    system_name=exported_system,
    output_path=str(output_file),
    system_base_power=100.0,
    scenario=scenario,
)

exporter_context = PluginContext(
    config=sienna_config,
    system=sienna_sys,
)
exporter = SiennaExporter.from_context(exporter_context)
exporter.on_export()