Skip to content

Commit adf4301

Browse files
committed
Rename resampling actor arguments
This is to make them easier to understand. Also require to use keyword arguments to avoid mixing up `resampling_period_s` and `max_data_age_in_periods`. Also remove the example from the init documentation as it was outdated and we already provide an example in `examples/` that at least gets actually checked for syntax and linted. Signed-off-by: Leandro Lucarella <[email protected]>
1 parent 4c51a1f commit adf4301

File tree

4 files changed

+36
-99
lines changed

4 files changed

+36
-99
lines changed

examples/resampling.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ async def run() -> None: # pylint: disable=too-many-locals
3232
data_source_request_sender = data_source_request_channel.new_sender()
3333
data_source_request_receiver = data_source_request_channel.new_receiver()
3434

35-
resampling_actor_request_channel = Broadcast[ComponentMetricRequest]("resample")
36-
resampling_actor_request_sender = resampling_actor_request_channel.new_sender()
37-
resampling_actor_request_receiver = resampling_actor_request_channel.new_receiver()
35+
resampling_request_channel = Broadcast[ComponentMetricRequest]("resample")
36+
resampling_request_sender = resampling_request_channel.new_sender()
37+
resampling_request_receiver = resampling_request_channel.new_receiver()
3838

3939
# Instantiate a data sourcing actor
4040
_data_sourcing_actor = DataSourcingActor(
@@ -44,8 +44,8 @@ async def run() -> None: # pylint: disable=too-many-locals
4444
# Instantiate a resampling actor
4545
_resampling_actor = ComponentMetricsResamplingActor(
4646
channel_registry=channel_registry,
47-
subscription_sender=data_source_request_sender,
48-
subscription_receiver=resampling_actor_request_receiver,
47+
data_sourcing_request_sender=data_source_request_sender,
48+
resampling_request_receiver=resampling_request_receiver,
4949
resampling_period_s=1.0,
5050
)
5151

@@ -69,10 +69,7 @@ async def run() -> None: # pylint: disable=too-many-locals
6969

7070
# Send the subscription requests
7171
await asyncio.gather(
72-
*[
73-
resampling_actor_request_sender.send(request)
74-
for request in subscription_requests
75-
]
72+
*[resampling_request_sender.send(request) for request in subscription_requests]
7673
)
7774

7875
# Merge sample receivers for each subscription into one receiver

src/frequenz/sdk/actor/_resampling.py

Lines changed: 26 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -45,103 +45,43 @@ class ComponentMetricsResamplingActor:
4545

4646
def __init__( # pylint: disable=too-many-arguments
4747
self,
48+
*,
4849
channel_registry: ChannelRegistry,
49-
subscription_sender: Sender[ComponentMetricRequest],
50-
subscription_receiver: Receiver[ComponentMetricRequest],
50+
data_sourcing_request_sender: Sender[ComponentMetricRequest],
51+
resampling_request_receiver: Receiver[ComponentMetricRequest],
5152
resampling_period_s: float = 0.2,
5253
max_data_age_in_periods: float = 3.0,
5354
resampling_function: ResamplingFunction = average,
5455
) -> None:
5556
"""Initialize the ComponentMetricsResamplingActor.
5657
5758
Args:
58-
channel_registry: global channel registry used for receiving component
59-
data from DataSource and for sending resampled samples downstream
60-
subscription_sender: channel for sending component metric requests to the
61-
DataSourcing actor
62-
subscription_receiver: channel for receiving component metric requests
63-
resampling_period_s: value describing how often resampling should be
64-
performed, in seconds
65-
max_data_age_in_periods: max age that samples shouldn't exceed in order
66-
to be used in the resampling function
67-
resampling_function: function to be applied to a sequence of samples within
68-
a resampling period to produce a single output sample
69-
70-
Example:
71-
```python
72-
async def run() -> None:
73-
await microgrid_api.initialize(HOST, PORT)
74-
75-
channel_registry = ChannelRegistry(name="Microgrid Channel Registry")
76-
77-
data_source_request_channel = Broadcast[ComponentMetricRequest](
78-
"Data Source Request Channel"
79-
)
80-
data_source_request_sender = data_source_request_channel.new_sender()
81-
data_source_request_receiver = data_source_request_channel.new_receiver()
82-
83-
resampling_actor_request_channel = Broadcast[ComponentMetricRequest](
84-
"Resampling Actor Request Channel"
85-
)
86-
resampling_actor_request_sender = resampling_actor_request_channel.new_sender()
87-
resampling_actor_request_receiver = resampling_actor_request_channel.new_receiver()
88-
89-
_data_sourcing_actor = DataSourcingActor(
90-
request_receiver=data_source_request_receiver, registry=channel_registry
91-
)
92-
93-
_resampling_actor = ComponentMetricsResamplingActor(
94-
channel_registry=channel_registry,
95-
subscription_sender=data_source_request_sender,
96-
subscription_receiver=resampling_actor_request_receiver,
97-
resampling_period_s=1.0,
98-
)
99-
100-
components = await microgrid_api.get().microgrid_api_client.components()
101-
battery_ids = [
102-
comp.component_id
103-
for comp in components
104-
if comp.category == ComponentCategory.BATTERY
105-
]
106-
107-
subscription_requests = [
108-
ComponentMetricRequest(
109-
namespace="Resampling",
110-
component_id=component_id,
111-
metric_id=ComponentMetricId.SOC,
112-
start_time=None,
113-
)
114-
for component_id in battery_ids
115-
]
116-
117-
await asyncio.gather(
118-
*[
119-
resampling_actor_request_sender.send(request)
120-
for request in subscription_requests
121-
]
122-
)
123-
124-
sample_receiver = MergeNamed(
125-
**{
126-
channel_name: channel_registry.new_receiver(channel_name)
127-
for channel_name in map(
128-
lambda req: req.get_channel_name(), subscription_requests
129-
)
130-
}
131-
)
132-
133-
async for channel_name, msg in sample_receiver:
134-
print(msg)
135-
136-
asyncio.run(run())
137-
```
59+
channel_registry: The channel registry used to get senders and
60+
receivers for data sourcing subscriptions.
61+
data_sourcing_request_sender: The sender used to send requests to
62+
the [`DataSourcingActor`][frequenz.sdk.actor.DataSourcingActor]
63+
to subscribe to component metrics.
64+
resampling_request_receiver: The receiver to use to receive new
65+
resampmling subscription requests.
66+
resampling_period_s: The time it passes between resampled data
67+
should be calculated (in seconds).
68+
max_data_age_in_periods: The maximum age a sample can have to be
69+
considered *relevant* for resampling purposes, expressed in the
70+
number of resampling periods. For exapmle is
71+
`resampling_period_s` is 3 and `max_data_age_in_periods` is 2,
72+
then data older than `3*2 = 6` secods will be discarded when
73+
creating a new sample and never passed to the resampling
74+
function.
75+
resampling_function: The function to be applied to the sequence of
76+
*relevant* samples at a given time. The result of the function
77+
is what is sent as the resampled data.
13878
"""
13979
self._channel_registry = channel_registry
140-
self._subscription_sender = subscription_sender
141-
self._subscription_receiver = subscription_receiver
14280
self._resampling_period_s = resampling_period_s
14381
self._max_data_age_in_periods: float = max_data_age_in_periods
14482
self._resampling_function: ResamplingFunction = resampling_function
83+
self._data_sourcing_request_sender = data_sourcing_request_sender
84+
self._resampling_request_receiver = resampling_request_receiver
14585
self._resampler = Resampler(
14686
resampling_period_s=resampling_period_s,
14787
max_data_age_in_periods=max_data_age_in_periods,
@@ -158,7 +98,7 @@ async def _subscribe(self, request: ComponentMetricRequest) -> None:
15898
request, namespace=request.namespace + ":Source"
15999
)
160100
data_source_channel_name = data_source_request.get_channel_name()
161-
await self._subscription_sender.send(data_source_request)
101+
await self._data_sourcing_request_sender.send(data_source_request)
162102
receiver = self._channel_registry.new_receiver(data_source_channel_name)
163103

164104
# This is a temporary hack until the Sender implementation uses
@@ -173,7 +113,7 @@ async def sink_adapter(sample: Sample) -> None:
173113

174114
async def _process_resampling_requests(self) -> None:
175115
"""Process resampling data requests."""
176-
async for request in self._subscription_receiver:
116+
async for request in self._resampling_request_receiver:
177117
await self._subscribe(request)
178118

179119
async def run(self) -> None:

tests/actor/test_resampling.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ async def test_component_metrics_resampling_actor( # pylint: disable=too-many-s
5858

5959
resampling_actor = ComponentMetricsResamplingActor(
6060
channel_registry=channel_registry,
61-
subscription_sender=data_source_req_chan.new_sender(),
62-
subscription_receiver=resampling_req_chan.new_receiver(),
61+
data_sourcing_request_sender=data_source_req_chan.new_sender(),
62+
resampling_request_receiver=resampling_req_chan.new_receiver(),
6363
resampling_period_s=0.2,
6464
max_data_age_in_periods=2,
6565
)

tests/timeseries/test_logical_meter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ def next_msg(value: float) -> ComponentData:
123123

124124
ComponentMetricsResamplingActor(
125125
channel_registry=channel_registry,
126-
subscription_sender=data_source_request_sender,
127-
subscription_receiver=resampling_actor_request_receiver,
126+
data_sourcing_request_sender=data_source_request_sender,
127+
resampling_request_receiver=resampling_actor_request_receiver,
128128
resampling_period_s=0.1,
129129
)
130130

0 commit comments

Comments
 (0)