|
1 |
| -from typing import Any, Literal, TypeAlias |
| 1 | +from typing import Literal, TypeAlias, TypeVar, overload |
2 | 2 |
|
3 | 3 | import numpy as np
|
4 | 4 | import optype.numpy as onp
|
5 |
| -from ._ltisys import lti |
| 5 | +import optype.numpy.compat as npc |
| 6 | +from ._ltisys import dlti, lti |
6 | 7 |
|
7 | 8 | __all__ = ["abcd_normalize", "cont2discrete", "ss2tf", "ss2zpk", "tf2ss", "zpk2ss"]
|
8 | 9 |
|
| 10 | +### |
| 11 | + |
9 | 12 | _ToSystemTF: TypeAlias = tuple[onp.ToComplex2D, onp.ToComplex1D] # (num, den)
|
10 |
| -_InSystemZPK: TypeAlias = tuple[onp.ToComplex1D, onp.ToComplex1D, onp.ToFloat] # (z, p, k) |
11 |
| -_InSystemSS: TypeAlias = tuple[onp.ToComplex2D, onp.ToComplex2D, onp.ToComplex2D, onp.ToComplex2D] # (A, B, C, D) |
| 13 | +_ToSystemZPK: TypeAlias = tuple[onp.ToComplex1D, onp.ToComplex1D, onp.ToFloat] # (z, p, k) |
| 14 | +_ToSystemSS: TypeAlias = tuple[onp.ToComplex2D, onp.ToComplex2D, onp.ToComplex2D, onp.ToComplex2D] # (A, B, C, D) |
12 | 15 |
|
13 |
| -_Inexact1D: TypeAlias = onp.Array1D[np.inexact[Any]] |
14 |
| -_Inexact2D: TypeAlias = onp.Array2D[np.inexact[Any]] |
| 16 | +_InexactT = TypeVar("_InexactT", bound=npc.inexact, default=npc.inexact) |
| 17 | +_Inexact1D: TypeAlias = onp.Array1D[_InexactT] |
| 18 | +_Inexact2D: TypeAlias = onp.Array2D[_InexactT] |
15 | 19 |
|
16 |
| -_SystemTF: TypeAlias = tuple[_Inexact2D, _Inexact1D] |
17 |
| -_SystemZPK: TypeAlias = tuple[_Inexact1D, _Inexact1D, float] |
18 |
| -_SystemSS: TypeAlias = tuple[_Inexact2D, _Inexact2D, _Inexact2D, _Inexact2D] |
| 20 | +_SystemTF: TypeAlias = tuple[_Inexact2D[_InexactT], _Inexact1D[_InexactT]] |
| 21 | +_SystemZPK: TypeAlias = tuple[_Inexact1D[_InexactT], _Inexact1D[_InexactT], float | np.float64] |
| 22 | +_SystemSS: TypeAlias = tuple[_Inexact2D[_InexactT], _Inexact2D[_InexactT], _Inexact2D[_InexactT], _Inexact2D[_InexactT]] |
19 | 23 |
|
20 |
| -_Method: TypeAlias = Literal["gbt", "bilinear", "euler", "backward_diff", "foh", "impulse", "zoh"] |
| 24 | +_DiscretizeMethod: TypeAlias = Literal["gbt", "bilinear", "euler", "backward_diff", "foh", "impulse", "zoh"] |
21 | 25 |
|
| 26 | +### |
| 27 | +@overload |
| 28 | +def abcd_normalize( |
| 29 | + A: onp.ToFloat2D | None = None, |
| 30 | + B: onp.ToFloat2D | None = None, |
| 31 | + C: onp.ToFloat2D | None = None, |
| 32 | + D: onp.ToFloat2D | None = None, |
| 33 | +) -> _SystemTF[npc.floating]: ... |
| 34 | +@overload |
22 | 35 | def abcd_normalize(
|
23 | 36 | A: onp.ToComplex2D | None = None,
|
24 | 37 | B: onp.ToComplex2D | None = None,
|
25 | 38 | C: onp.ToComplex2D | None = None,
|
26 | 39 | D: onp.ToComplex2D | None = None,
|
27 | 40 | ) -> _SystemTF: ...
|
| 41 | + |
| 42 | +# |
| 43 | +@overload |
| 44 | +def tf2ss(num: onp.ToFloat2D, den: onp.ToFloat1D) -> _SystemSS[npc.floating]: ... |
| 45 | +@overload |
28 | 46 | def tf2ss(num: onp.ToComplex2D, den: onp.ToComplex1D) -> _SystemSS: ...
|
29 |
| -def zpk2ss(z: onp.ToComplex1D, p: onp.ToComplex1D, k: onp.ToFloat) -> _SystemSS: ... |
| 47 | + |
| 48 | +# |
| 49 | +@overload |
| 50 | +def ss2tf( |
| 51 | + A: onp.ToFloat2D, |
| 52 | + B: onp.ToFloat2D, |
| 53 | + C: onp.ToFloat2D, |
| 54 | + D: onp.ToFloat2D, |
| 55 | + input: onp.ToInt = 0, |
| 56 | +) -> _SystemTF[npc.floating]: ... |
| 57 | +@overload |
30 | 58 | def ss2tf(A: onp.ToComplex2D, B: onp.ToComplex2D, C: onp.ToComplex2D, D: onp.ToComplex2D, input: onp.ToInt = 0) -> _SystemTF: ...
|
| 59 | + |
| 60 | +# |
| 61 | +@overload |
| 62 | +def zpk2ss(z: onp.ToFloat1D, p: onp.ToFloat1D, k: onp.ToFloat) -> _SystemSS[npc.floating]: ... |
| 63 | +@overload |
| 64 | +def zpk2ss(z: onp.ToComplex1D, p: onp.ToComplex1D, k: onp.ToFloat) -> _SystemSS: ... |
| 65 | + |
| 66 | +# |
| 67 | +@overload |
| 68 | +def ss2zpk( |
| 69 | + A: onp.ToFloat2D, |
| 70 | + B: onp.ToFloat2D, |
| 71 | + C: onp.ToFloat2D, |
| 72 | + D: onp.ToFloat2D, |
| 73 | + input: onp.ToInt = 0, |
| 74 | +) -> _SystemZPK[npc.floating]: ... |
| 75 | +@overload |
31 | 76 | def ss2zpk(
|
32 | 77 | A: onp.ToComplex2D,
|
33 | 78 | B: onp.ToComplex2D,
|
34 | 79 | C: onp.ToComplex2D,
|
35 | 80 | D: onp.ToComplex2D,
|
36 | 81 | input: onp.ToInt = 0,
|
37 | 82 | ) -> _SystemZPK: ...
|
| 83 | + |
| 84 | +# TODO: overload on lti subclasses |
| 85 | +@overload |
| 86 | +def cont2discrete( |
| 87 | + system: lti, |
| 88 | + dt: float, |
| 89 | + method: _DiscretizeMethod = "zoh", |
| 90 | + alpha: onp.ToJustFloat | None = None, |
| 91 | +) -> dlti: ... |
| 92 | +@overload |
| 93 | +def cont2discrete( |
| 94 | + system: _ToSystemTF, |
| 95 | + dt: float, |
| 96 | + method: _DiscretizeMethod = "zoh", |
| 97 | + alpha: onp.ToJustFloat | None = None, |
| 98 | +) -> tuple[_Inexact2D[_InexactT], _Inexact1D[_InexactT], float]: ... |
| 99 | +@overload |
| 100 | +def cont2discrete( |
| 101 | + system: _ToSystemZPK, |
| 102 | + dt: float, |
| 103 | + method: _DiscretizeMethod = "zoh", |
| 104 | + alpha: onp.ToJustFloat | None = None, |
| 105 | +) -> tuple[_Inexact1D[_InexactT], _Inexact1D[_InexactT], float, float]: ... |
| 106 | +@overload |
38 | 107 | def cont2discrete(
|
39 |
| - system: lti | _ToSystemTF | _InSystemZPK | _InSystemSS, |
| 108 | + system: _ToSystemSS, |
40 | 109 | dt: float,
|
41 |
| - method: _Method = "zoh", |
42 |
| - alpha: onp.ToFloat | None = None, |
43 |
| -) -> ( |
44 |
| - tuple[_Inexact2D, _Inexact1D, float] |
45 |
| - | tuple[_Inexact1D, _Inexact1D, float, float] |
46 |
| - | tuple[_Inexact2D, _Inexact2D, _Inexact2D, _Inexact2D, float] |
47 |
| -): ... |
| 110 | + method: _DiscretizeMethod = "zoh", |
| 111 | + alpha: onp.ToJustFloat | None = None, |
| 112 | +) -> tuple[_Inexact2D[_InexactT], _Inexact2D[_InexactT], _Inexact2D[_InexactT], _Inexact2D[_InexactT], float]: ... |
0 commit comments