Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -266,9 +266,10 @@
"filter": {
"casefold": true,
"field": "category",
"op": "eq",
"op": "in",
"values": [
"reeds-generator"
"reeds-generator",
"imports"
]
},
"getters": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,11 @@ def _convert_hydro_budget_time_series(ts: Any, cadence: str, capacity: float) ->

def attach_time_series_to_generators(context: PluginContext) -> None:
"""Transfer time series from ReEDS generators to translated PLEXOS generators (with duplicate check)."""
from r2x_reeds.models.components import ReEDSGenerator, ReEDSHydroGenerator, ReEDSVariableGenerator
from r2x_reeds.models.components import (
ReEDSGenerator,
ReEDSHydroGenerator,
ReEDSVariableGenerator,
)

if context.source_system is None or context.target_system is None:
return
Expand All @@ -176,6 +180,11 @@ def attach_time_series_to_generators(context: PluginContext) -> None:
variable_generators = {
gen.name: gen for gen in context.source_system.get_components(ReEDSVariableGenerator)
}
import_generators = {
gen.name: gen
for gen in context.source_system.get_components(ReEDSGenerator)
if (getattr(gen, "category", "") or "").casefold() == "imports"
}
target_generators = {gen.name: gen for gen in context.target_system.get_components(PLEXOSGenerator)}

for name, source_gen in source_generators.items():
Expand Down Expand Up @@ -244,6 +253,23 @@ def attach_time_series_to_generators(context: PluginContext) -> None:
)
continue

if name in import_generators:
target_ext = dict(target_gen.ext or {})
target_ext["r2x_category"] = "imports"
target_gen.ext = target_ext
for metadata in context.source_system.time_series.list_time_series_metadata(source_gen):
for ts in context.source_system.list_time_series(
source_gen, name=metadata.name, **metadata.features
):
if not context.target_system.has_time_series(
target_gen,
name=ts.name,
time_series_type=type(ts),
**metadata.features,
):
context.target_system.add_time_series(deepcopy(ts), target_gen, **metadata.features)
continue

if name in variable_generators:
for ts in context.source_system.list_time_series(source_gen):
if ts.name == "max_active_power" and not context.target_system.has_time_series(
Expand Down
39 changes: 39 additions & 0 deletions packages/r2x-reeds-to-plexos/tests/test_getters_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,45 @@ def test_attach_time_series_to_generators_skips_missing_target(context):
assert added == []


def test_attach_import_time_series_preserves_metadata_features(context):
from r2x_plexos.models import PLEXOSGenerator
from r2x_reeds.models.components import ReEDSGenerator

region = ReEDSRegion(name="R1", transmission_region="Z1")
source_gen = ReEDSGenerator(
name="IMPORT1",
region=region,
technology="hydro",
capacity=10.0,
category="imports",
)
target_gen = PLEXOSGenerator(name="IMPORT1")
features = {"solve_year": 2035, "weather_year": 2012}
source_ts = types.SimpleNamespace(name="hydro_budget")
metadata = types.SimpleNamespace(name=source_ts.name, features=features)
source_queries = []
target_queries = []
added = []

context.source_system.add_component(region)
context.source_system.add_component(source_gen)
context.target_system.add_component(target_gen)
context.source_system.time_series.list_time_series_metadata = lambda _component: [metadata]
context.source_system.list_time_series = lambda _component, **kwargs: (
source_queries.append(kwargs) or [source_ts]
)
context.target_system.has_time_series = lambda _component, **kwargs: (
target_queries.append(kwargs) or False
)
context.target_system.add_time_series = lambda ts, _component, **kwargs: added.append((ts, kwargs))

getters_utils.attach_time_series_to_generators(context)

assert source_queries == [{"name": "hydro_budget", **features}]
assert target_queries == [{"name": "hydro_budget", "time_series_type": type(source_ts), **features}]
assert added == [(source_ts, features)]


def test_membership_helpers_skip_paths(context):
region = PLEXOSRegion(name="NO_NODE")
context.target_system.add_component(region)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,47 @@ def test_reeds_generators_translate_to_plexos_types(tmp_path) -> None:
assert {"THERM1", "VRE1", "HYDRO1"} <= names


def test_import_generators_translate_with_time_series(tmp_path) -> None:
from datetime import datetime, timedelta

from infrasys.time_series_models import SingleTimeSeries
from r2x_plexos.models import PLEXOSGenerator
from r2x_reeds.models import ReEDSGenerator, ReEDSRegion
from r2x_reeds_to_plexos.getters_utils import attach_time_series_to_generators

context, rules = make_context_and_rules(tmp_path)
context.source_system = System(name="source", auto_add_composed_components=True)
region = ReEDSRegion(name="p1", transmission_region="Z1")
context.source_system.add_component(region)
generator = ReEDSGenerator(
name="can-imports_init-1_p1",
category="imports",
region=region,
technology="can-imports",
capacity=50.0,
)
context.source_system.add_component(generator)
context.source_system.add_time_series(
SingleTimeSeries.from_array(
data=[1.0, 2.0],
name="hydro_budget",
initial_timestamp=datetime(2024, 1, 1),
resolution=timedelta(days=1),
),
generator,
)
context.target_system = System(name="target", auto_add_composed_components=True)
context.rules = rules

result = apply_rules_to_context(context)
assert result.total_rules > 0
attach_time_series_to_generators(context)

target_generator = next(context.target_system.get_components(PLEXOSGenerator))
assert target_generator.name == generator.name
assert context.target_system.has_time_series(target_generator, name="hydro_budget")


def test_reeds_storage_translates_to_plexos_storage(tmp_path) -> None:
from r2x_plexos.models import PLEXOSBattery, PLEXOSGenerator
from r2x_reeds.models import ReEDSRegion, ReEDSStorage
Expand Down