|
12 | 12 | from abc import ABC |
13 | 13 | from collections import deque |
14 | 14 | from collections.abc import Callable |
15 | | -from typing import Generic, TypeVar, Union, overload |
| 15 | +from typing import Generic, Union, overload |
16 | 16 |
|
17 | 17 | from frequenz.channels import Broadcast, Receiver |
18 | 18 |
|
|
78 | 78 | "HigherOrderFormulaBuilder3Phase", # type: ignore[type-arg] |
79 | 79 | ] |
80 | 80 |
|
81 | | -_GenericEngine = TypeVar( |
82 | | - "_GenericEngine", |
83 | | - "FormulaEngine", # type: ignore |
84 | | - "FormulaEngine3Phase", # type: ignore |
85 | | -) |
86 | | - |
87 | | -_GenericHigherOrderBuilder = TypeVar( |
88 | | - "_GenericHigherOrderBuilder", |
89 | | - "HigherOrderFormulaBuilder", # type: ignore |
90 | | - "HigherOrderFormulaBuilder3Phase", # type: ignore |
91 | | -) |
92 | | - |
93 | | - |
94 | | -# This class has multiple generic type parameters that should also restrict each other, |
95 | | -# but mypy doesn't support that, so we need to use `# type: ignore` in several places in |
96 | | -# this, and subsequent classes, to avoid mypy errors. |
97 | | -class _ComposableFormulaEngine( |
98 | | - ABC, Generic[_GenericEngine, _GenericHigherOrderBuilder, QuantityT] |
99 | | -): |
100 | | - """A base class for formula engines.""" |
101 | | - |
102 | | - _create_method: Callable[[float], QuantityT] |
103 | | - _higher_order_builder: type[_GenericHigherOrderBuilder] |
104 | | - _task: asyncio.Task[None] | None = None |
105 | | - |
106 | | - async def _stop(self) -> None: |
107 | | - """Stop a running formula engine.""" |
108 | | - if self._task is None: |
109 | | - return |
110 | | - await cancel_and_await(self._task) |
111 | | - |
112 | | - def __add__( |
113 | | - self, |
114 | | - other: _GenericEngine | _GenericHigherOrderBuilder | QuantityT, |
115 | | - ) -> _GenericHigherOrderBuilder: |
116 | | - """Return a formula builder that adds (data in) `other` to `self`. |
117 | | -
|
118 | | - Args: |
119 | | - other: A formula receiver, or a formula builder instance corresponding to a |
120 | | - sub-expression. |
121 | | -
|
122 | | - Returns: |
123 | | - A formula builder that can take further expressions, or can be built |
124 | | - into a formula engine. |
125 | | - """ |
126 | | - return self._higher_order_builder(self, self._create_method) + other # type: ignore |
127 | | - |
128 | | - def __sub__( |
129 | | - self, other: _GenericEngine | _GenericHigherOrderBuilder | QuantityT |
130 | | - ) -> _GenericHigherOrderBuilder: |
131 | | - """Return a formula builder that subtracts (data in) `other` from `self`. |
132 | | -
|
133 | | - Args: |
134 | | - other: A formula receiver, or a formula builder instance corresponding to a |
135 | | - sub-expression. |
136 | | -
|
137 | | - Returns: |
138 | | - A formula builder that can take further expressions, or can be built |
139 | | - into a formula engine. |
140 | | - """ |
141 | | - return self._higher_order_builder(self, self._create_method) - other # type: ignore |
142 | | - |
143 | | - def __mul__( |
144 | | - self, other: _GenericEngine | _GenericHigherOrderBuilder | float |
145 | | - ) -> _GenericHigherOrderBuilder: |
146 | | - """Return a formula builder that multiplies (data in) `self` with `other`. |
147 | | -
|
148 | | - Args: |
149 | | - other: A formula receiver, or a formula builder instance corresponding to a |
150 | | - sub-expression. |
151 | | -
|
152 | | - Returns: |
153 | | - A formula builder that can take further expressions, or can be built |
154 | | - into a formula engine. |
155 | | - """ |
156 | | - return self._higher_order_builder(self, self._create_method) * other # type: ignore |
157 | | - |
158 | | - def __truediv__( |
159 | | - self, other: _GenericEngine | _GenericHigherOrderBuilder | float |
160 | | - ) -> _GenericHigherOrderBuilder: |
161 | | - """Return a formula builder that divides (data in) `self` by `other`. |
162 | | -
|
163 | | - Args: |
164 | | - other: A formula receiver, or a formula builder instance corresponding to a |
165 | | - sub-expression. |
166 | | -
|
167 | | - Returns: |
168 | | - A formula builder that can take further expressions, or can be built |
169 | | - into a formula engine. |
170 | | - """ |
171 | | - return self._higher_order_builder(self, self._create_method) / other # type: ignore |
172 | | - |
173 | | - def max( |
174 | | - self, other: _GenericEngine | _GenericHigherOrderBuilder | QuantityT |
175 | | - ) -> _GenericHigherOrderBuilder: |
176 | | - """Return a formula engine that outputs the maximum of `self` and `other`. |
177 | | -
|
178 | | - Args: |
179 | | - other: A formula receiver, a formula builder or a QuantityT instance |
180 | | - corresponding to a sub-expression. |
181 | | -
|
182 | | - Returns: |
183 | | - A formula builder that can take further expressions, or can be built |
184 | | - into a formula engine. |
185 | | - """ |
186 | | - return self._higher_order_builder(self, self._create_method).max(other) # type: ignore |
187 | | - |
188 | | - def min( |
189 | | - self, other: _GenericEngine | _GenericHigherOrderBuilder | QuantityT |
190 | | - ) -> _GenericHigherOrderBuilder: |
191 | | - """Return a formula engine that outputs the minimum of `self` and `other`. |
192 | | -
|
193 | | - Args: |
194 | | - other: A formula receiver, a formula builder or a QuantityT instance |
195 | | - corresponding to a sub-expression. |
196 | | -
|
197 | | -
|
198 | | - Returns: |
199 | | - A formula builder that can take further expressions, or can be built |
200 | | - into a formula engine. |
201 | | - """ |
202 | | - return self._higher_order_builder(self, self._create_method).min(other) # type: ignore |
203 | | - |
204 | | - def consumption(self) -> _GenericHigherOrderBuilder: |
205 | | - """ |
206 | | - Return a formula builder that applies the consumption operator on `self`. |
207 | | -
|
208 | | - The consumption operator returns either the identity if the power value is |
209 | | - positive or 0. |
210 | | - """ |
211 | | - return self._higher_order_builder(self, self._create_method).consumption() # type: ignore |
212 | | - |
213 | | - def production(self) -> _GenericHigherOrderBuilder: |
214 | | - """ |
215 | | - Return a formula builder that applies the production operator on `self`. |
216 | | -
|
217 | | - The production operator returns either the absolute value if the power value is |
218 | | - negative or 0. |
219 | | - """ |
220 | | - return self._higher_order_builder(self, self._create_method).production() # type: ignore |
221 | | - |
222 | 81 |
|
223 | 82 | class FormulaEngine(Generic[QuantityT]): |
224 | 83 | """[`FormulaEngine`][frequenz.sdk.timeseries.formula_engine.FormulaEngine]s are a |
|
0 commit comments