Skip to content

Commit 358e064

Browse files
committed
Replace Bounds classes in BatteryPool/PowerManager with a single one
The new `Bounds` class is generic over quantities, and is defined in the `frequenz.sdk.timeseries` package. Signed-off-by: Sahas Subramanian <[email protected]>
1 parent ea5e28c commit 358e064

File tree

11 files changed

+43
-41
lines changed

11 files changed

+43
-41
lines changed

src/frequenz/sdk/actor/_power_managing/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33

44
"""A power manager implementation."""
55

6-
from ._base_classes import Algorithm, Bounds, Proposal, Report, ReportRequest
6+
from ._base_classes import Algorithm, Proposal, Report, ReportRequest
77
from ._power_managing_actor import PowerManagingActor
88

99
__all__ = [
1010
"Algorithm",
11-
"Bounds",
1211
"PowerManagingActor",
1312
"Proposal",
1413
"Report",

src/frequenz/sdk/actor/_power_managing/_base_classes.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import enum
1212
import typing
1313

14+
from ... import timeseries
1415
from ...timeseries import Power
1516

1617
if typing.TYPE_CHECKING:
@@ -40,25 +41,14 @@ def get_channel_name(self) -> str:
4041
return f"power_manager.report.{self.battery_ids=}.{self.priority=}"
4142

4243

43-
@dataclasses.dataclass(frozen=True)
44-
class Bounds:
45-
"""Lower and upper bound values."""
46-
47-
lower: Power
48-
"""Lower bound."""
49-
50-
upper: Power
51-
"""Upper bound."""
52-
53-
5444
@dataclasses.dataclass(frozen=True)
5545
class Report:
5646
"""Current PowerManager report for a set of batteries."""
5747

5848
target_power: Power | None
5949
"""The currently set power for the batteries."""
6050

61-
inclusion_bounds: Bounds | None
51+
inclusion_bounds: timeseries.Bounds[Power] | None
6252
"""The available inclusion bounds for the batteries, for the actor's priority.
6353
6454
These bounds are adjusted to any restrictions placed by actors with higher

src/frequenz/sdk/actor/_power_managing/_matryoshka.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010

1111
from typing_extensions import override
1212

13+
from ... import timeseries
1314
from ...timeseries import Power
14-
from ._base_classes import BaseAlgorithm, Bounds, Proposal, Report
15+
from ._base_classes import BaseAlgorithm, Proposal, Report
1516
from ._sorted_set import SortedSet
1617

1718
if typing.TYPE_CHECKING:
@@ -173,5 +174,7 @@ def get_status(
173174

174175
return Report(
175176
target_power,
176-
inclusion_bounds=Bounds(lower=lower_bound, upper=upper_bound),
177+
inclusion_bounds=timeseries.Bounds[Power](
178+
lower=lower_bound, upper=upper_bound
179+
),
177180
)

src/frequenz/sdk/timeseries/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
```
3636
"""
3737

38-
from ._base_types import UNIX_EPOCH, Sample, Sample3Phase
38+
from ._base_types import UNIX_EPOCH, Bounds, Sample, Sample3Phase
3939
from ._moving_window import MovingWindow
4040
from ._periodic_feature_extractor import PeriodicFeatureExtractor
4141
from ._quantities import (
@@ -51,6 +51,7 @@
5151
from ._resampling import ResamplerConfig
5252

5353
__all__ = [
54+
"Bounds",
5455
"MovingWindow",
5556
"PeriodicFeatureExtractor",
5657
"ResamplerConfig",

src/frequenz/sdk/timeseries/_base_types.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,14 @@ def map(
135135
value_p2=default if self.value_p2 is None else function(self.value_p2),
136136
value_p3=default if self.value_p3 is None else function(self.value_p3),
137137
)
138+
139+
140+
@dataclass(frozen=True)
141+
class Bounds(Generic[QuantityT]):
142+
"""Lower and upper bound values."""
143+
144+
lower: QuantityT
145+
"""Lower bound."""
146+
147+
upper: QuantityT
148+
"""Upper bound."""

src/frequenz/sdk/timeseries/battery_pool/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33

44
"""Manage a pool of batteries."""
55

6-
from ._result_types import Bounds, PowerMetrics
6+
from ._result_types import PowerMetrics
77
from .battery_pool import BatteryPool
88

99
__all__ = [
1010
"BatteryPool",
1111
"PowerMetrics",
12-
"Bounds",
1312
]

src/frequenz/sdk/timeseries/battery_pool/_metric_calculator.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@
1010
from datetime import datetime, timezone
1111
from typing import Generic, TypeVar
1212

13+
from ... import timeseries
1314
from ...microgrid import connection_manager
1415
from ...microgrid.component import ComponentCategory, ComponentMetricId, InverterType
1516
from ...timeseries import Sample
1617
from .._quantities import Energy, Percentage, Power, Temperature
1718
from ._component_metrics import ComponentMetricsData
18-
from ._result_types import Bounds, PowerMetrics
19+
from ._result_types import PowerMetrics
1920

2021
_logger = logging.getLogger(__name__)
2122

@@ -653,11 +654,11 @@ def calculate(
653654

654655
return PowerMetrics(
655656
timestamp=timestamp,
656-
inclusion_bounds=Bounds(
657+
inclusion_bounds=timeseries.Bounds(
657658
Power.from_watts(inclusion_bounds_lower),
658659
Power.from_watts(inclusion_bounds_upper),
659660
),
660-
exclusion_bounds=Bounds(
661+
exclusion_bounds=timeseries.Bounds(
661662
Power.from_watts(exclusion_bounds_lower),
662663
Power.from_watts(exclusion_bounds_upper),
663664
),

src/frequenz/sdk/timeseries/battery_pool/_result_types.py

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,10 @@
66
from dataclasses import dataclass, field
77
from datetime import datetime
88

9+
from .. import _base_types
910
from .._quantities import Power
1011

1112

12-
@dataclass
13-
class Bounds:
14-
"""Lower and upper bound values."""
15-
16-
lower: Power
17-
"""Lower bound."""
18-
19-
upper: Power
20-
"""Upper bound."""
21-
22-
2313
@dataclass
2414
class PowerMetrics:
2515
"""Power bounds metrics."""
@@ -29,7 +19,7 @@ class PowerMetrics:
2919
"""Timestamp of the metrics."""
3020

3121
# pylint: disable=line-too-long
32-
inclusion_bounds: Bounds | None
22+
inclusion_bounds: _base_types.Bounds[Power] | None
3323
"""Inclusion power bounds for all batteries in the battery pool instance.
3424
3525
This is the range within which power requests are allowed by the battery pool.
@@ -42,7 +32,7 @@ class PowerMetrics:
4232
details.
4333
"""
4434

45-
exclusion_bounds: Bounds | None
35+
exclusion_bounds: _base_types.Bounds[Power] | None
4636
"""Exclusion power bounds for all batteries in the battery pool instance.
4737
4838
This is the range within which power requests are NOT allowed by the battery pool.

tests/actor/_power_managing/test_matryoshka.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from datetime import datetime, timezone
77

8+
from frequenz.sdk import timeseries
89
from frequenz.sdk.actor._power_managing import Proposal
910
from frequenz.sdk.actor._power_managing._matryoshka import Matryoshka
1011
from frequenz.sdk.timeseries import Power, battery_pool
@@ -17,10 +18,10 @@ async def test_matryoshka_algorithm() -> None: # pylint: disable=too-many-state
1718
algorithm = Matryoshka()
1819
system_bounds = battery_pool.PowerMetrics(
1920
timestamp=datetime.now(tz=timezone.utc),
20-
inclusion_bounds=battery_pool.Bounds(
21+
inclusion_bounds=timeseries.Bounds(
2122
lower=Power.from_watts(-200.0), upper=Power.from_watts(200.0)
2223
),
23-
exclusion_bounds=battery_pool.Bounds(lower=Power.zero(), upper=Power.zero()),
24+
exclusion_bounds=timeseries.Bounds(lower=Power.zero(), upper=Power.zero()),
2425
)
2526

2627
call_count = 0

tests/timeseries/_battery_pool/test_battery_pool.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,15 @@
2828
from frequenz.sdk.actor import ResamplerConfig
2929
from frequenz.sdk.actor.power_distributing import BatteryStatus
3030
from frequenz.sdk.microgrid.component import ComponentCategory
31-
from frequenz.sdk.timeseries import Energy, Percentage, Power, Sample, Temperature
32-
from frequenz.sdk.timeseries.battery_pool import BatteryPool, Bounds, PowerMetrics
31+
from frequenz.sdk.timeseries import (
32+
Bounds,
33+
Energy,
34+
Percentage,
35+
Power,
36+
Sample,
37+
Temperature,
38+
)
39+
from frequenz.sdk.timeseries.battery_pool import BatteryPool, PowerMetrics
3340
from frequenz.sdk.timeseries.battery_pool._metric_calculator import (
3441
battery_inverter_mapping,
3542
)

0 commit comments

Comments
 (0)