flode 0.60.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. flode/__init__.py +88 -0
  2. flode/analysis/__init__.py +37 -0
  3. flode/analysis/frequency_response.py +349 -0
  4. flode/analysis/linearize.py +714 -0
  5. flode/analysis/stability.py +229 -0
  6. flode/blocks/__init__.py +107 -0
  7. flode/blocks/_lti_utils.py +121 -0
  8. flode/blocks/cast.py +66 -0
  9. flode/blocks/continuous.py +474 -0
  10. flode/blocks/discontinuities.py +258 -0
  11. flode/blocks/discrete.py +612 -0
  12. flode/blocks/logic.py +120 -0
  13. flode/blocks/lookup.py +1025 -0
  14. flode/blocks/mathops.py +598 -0
  15. flode/blocks/pythonfunc.py +560 -0
  16. flode/blocks/pythonfunc_rewrite.py +1935 -0
  17. flode/blocks/pythonfunc_source.py +392 -0
  18. flode/blocks/random_source.py +179 -0
  19. flode/blocks/rounding.py +65 -0
  20. flode/blocks/routing.py +582 -0
  21. flode/blocks/sinks.py +309 -0
  22. flode/blocks/sources.py +215 -0
  23. flode/blocks/transport_delay.py +92 -0
  24. flode/blocks/userfunc.py +359 -0
  25. flode/core/__init__.py +5 -0
  26. flode/core/block.py +497 -0
  27. flode/core/decorator.py +1149 -0
  28. flode/core/dtypes.py +1026 -0
  29. flode/core/identifiers.py +157 -0
  30. flode/core/persistence.py +1319 -0
  31. flode/core/simulator.py +1690 -0
  32. flode/exceptions.py +226 -0
  33. flode/libraries/__init__.py +341 -0
  34. flode/libraries/_loader.py +302 -0
  35. flode/libraries/std.flwlib.json +347 -0
  36. flode/server/__init__.py +23 -0
  37. flode/server/app.py +185 -0
  38. flode/server/cli.py +555 -0
  39. flode/server/config.py +516 -0
  40. flode/server/errors.py +397 -0
  41. flode/server/library_registry.py +125 -0
  42. flode/server/migrations/__init__.py +80 -0
  43. flode/server/registry.py +950 -0
  44. flode/server/registry_translations.py +804 -0
  45. flode/server/routes/__init__.py +16 -0
  46. flode/server/routes/blocks.py +447 -0
  47. flode/server/routes/files.py +800 -0
  48. flode/server/routes/libraries.py +129 -0
  49. flode/server/routes/models.py +67 -0
  50. flode/server/routes/simulations.py +355 -0
  51. flode/server/runtime.py +354 -0
  52. flode/server/security/__init__.py +7 -0
  53. flode/server/security/origin.py +122 -0
  54. flode/server/security/paths.py +143 -0
  55. flode/server/settings.py +42 -0
  56. flode/server/static/.app-version +1 -0
  57. flode/server/static/assets/index-BnL2nNOe.css +1 -0
  58. flode/server/static/assets/index-DMWZBAA_.js +100 -0
  59. flode/server/static/assets/index-DMWZBAA_.js.map +1 -0
  60. flode/server/static/favicon.ico +0 -0
  61. flode/server/static/favicon.svg +9 -0
  62. flode/server/static/index.html +15 -0
  63. flode/subsystems/__init__.py +20 -0
  64. flode/subsystems/_mask.py +154 -0
  65. flode/subsystems/control_blocks.py +245 -0
  66. flode/subsystems/ports.py +146 -0
  67. flode/subsystems/subsystem.py +1173 -0
  68. flode-0.60.3.dist-info/METADATA +91 -0
  69. flode-0.60.3.dist-info/RECORD +73 -0
  70. flode-0.60.3.dist-info/WHEEL +5 -0
  71. flode-0.60.3.dist-info/entry_points.txt +2 -0
  72. flode-0.60.3.dist-info/licenses/LICENSE +21 -0
  73. flode-0.60.3.dist-info/top_level.txt +1 -0
flode/blocks/logic.py ADDED
@@ -0,0 +1,120 @@
1
+ """論理・関係演算ブロック。
2
+
3
+ Phase 1 では ``RelationalOperator`` (比較) と ``LogicalOperator`` (論理) を提供する。
4
+ 信号は ``float`` のまま扱い、論理値は ``0.0`` / ``1.0`` で表現する
5
+ (リファレンスツールの Boolean 信号モード相当は Phase 2 以降)。
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from typing import Any
11
+
12
+ import numpy as np
13
+ import numpy.typing as npt
14
+
15
+ from ..core.block import Block
16
+ from ..exceptions import BlockSpecError
17
+
18
+
19
+ class RelationalOperator(Block):
20
+ """2 入力の比較 ``y = u[0] op u[1]``。
21
+
22
+ Args:
23
+ operator: ``"<"``, ``"<="``, ``"=="``, ``"!="``, ``">="``, ``">"`` のいずれか。
24
+ """
25
+
26
+ _ALLOWED_OPS = ("<", "<=", "==", "!=", ">=", ">")
27
+ # ADR-0039 follow-up (v0.15.0): GUI ParameterPanel が enum select を出すヒント
28
+ _param_enums = {"operator": _ALLOWED_OPS}
29
+
30
+ def __init__(
31
+ self,
32
+ operator: str = "<",
33
+ *,
34
+ id: str | None = None,
35
+ name: str | None = None,
36
+ ):
37
+ if operator not in self._ALLOWED_OPS:
38
+ raise BlockSpecError(
39
+ f"RelationalOperator: operator must be one of {self._ALLOWED_OPS}, got {operator!r}"
40
+ )
41
+ super().__init__(id=id, name=name, n_inputs=2, n_outputs=1)
42
+ self.operator = operator
43
+ self._params = {"operator": operator}
44
+
45
+ def output(self, t: float, x: npt.NDArray[Any], u: npt.NDArray[Any]) -> npt.NDArray[Any]:
46
+ # SM-D Stage 1 (SPEC-0028 §3.6): float() を外し int64 同士の厳密比較を
47
+ # 守る (float64 入力では比較結果不変 = 既存挙動に影響なし)
48
+ a, b = u[0], u[1]
49
+ op = self.operator
50
+ if op == "<":
51
+ r = a < b
52
+ elif op == "<=":
53
+ r = a <= b
54
+ elif op == "==":
55
+ r = a == b
56
+ elif op == "!=":
57
+ r = a != b
58
+ elif op == ">=":
59
+ r = a >= b
60
+ else: # ">"
61
+ r = a > b
62
+ return np.array([1.0 if r else 0.0])
63
+
64
+
65
+ class LogicalOperator(Block):
66
+ """論理演算ブロック。入力は ``0.0`` / 非 0 (= True 扱い) で解釈。
67
+
68
+ Args:
69
+ operator: ``"AND"``, ``"OR"``, ``"NOT"``, ``"XOR"``, ``"NAND"``, ``"NOR"``。
70
+ n_inputs: 入力ポート数。``"NOT"`` は ``1`` 固定、その他は 2 以上。
71
+ """
72
+
73
+ _BINARY_OPS = ("AND", "OR", "XOR", "NAND", "NOR")
74
+ _UNARY_OPS = ("NOT",)
75
+ # ADR-0039 follow-up (v0.15.0): GUI ParameterPanel が enum select を出すヒント
76
+ _param_enums = {"operator": _UNARY_OPS + _BINARY_OPS}
77
+
78
+ def __init__(
79
+ self,
80
+ operator: str = "AND",
81
+ n_inputs: int = 2,
82
+ *,
83
+ id: str | None = None,
84
+ name: str | None = None,
85
+ ):
86
+ if operator in self._UNARY_OPS:
87
+ if n_inputs != 1:
88
+ raise BlockSpecError(
89
+ f"LogicalOperator: {operator} requires n_inputs=1, got {n_inputs}"
90
+ )
91
+ elif operator in self._BINARY_OPS:
92
+ if n_inputs < 2:
93
+ raise BlockSpecError(
94
+ f"LogicalOperator: {operator} requires n_inputs >= 2, got {n_inputs}"
95
+ )
96
+ else:
97
+ raise BlockSpecError(
98
+ f"LogicalOperator: unknown operator {operator!r}; "
99
+ f"allowed: {self._UNARY_OPS + self._BINARY_OPS}"
100
+ )
101
+ super().__init__(id=id, name=name, n_inputs=n_inputs, n_outputs=1)
102
+ self.operator = operator
103
+ self._params = {"operator": operator, "n_inputs": int(n_inputs)}
104
+
105
+ def output(self, t: float, x: npt.NDArray[Any], u: npt.NDArray[Any]) -> npt.NDArray[Any]:
106
+ op = self.operator
107
+ bools = [bool(v) for v in u]
108
+ if op == "NOT":
109
+ r = not bools[0]
110
+ elif op == "AND":
111
+ r = all(bools)
112
+ elif op == "OR":
113
+ r = any(bools)
114
+ elif op == "XOR":
115
+ r = sum(1 for b in bools if b) % 2 == 1
116
+ elif op == "NAND":
117
+ r = not all(bools)
118
+ else: # "NOR"
119
+ r = not any(bools)
120
+ return np.array([1.0 if r else 0.0])