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.
- flode/__init__.py +88 -0
- flode/analysis/__init__.py +37 -0
- flode/analysis/frequency_response.py +349 -0
- flode/analysis/linearize.py +714 -0
- flode/analysis/stability.py +229 -0
- flode/blocks/__init__.py +107 -0
- flode/blocks/_lti_utils.py +121 -0
- flode/blocks/cast.py +66 -0
- flode/blocks/continuous.py +474 -0
- flode/blocks/discontinuities.py +258 -0
- flode/blocks/discrete.py +612 -0
- flode/blocks/logic.py +120 -0
- flode/blocks/lookup.py +1025 -0
- flode/blocks/mathops.py +598 -0
- flode/blocks/pythonfunc.py +560 -0
- flode/blocks/pythonfunc_rewrite.py +1935 -0
- flode/blocks/pythonfunc_source.py +392 -0
- flode/blocks/random_source.py +179 -0
- flode/blocks/rounding.py +65 -0
- flode/blocks/routing.py +582 -0
- flode/blocks/sinks.py +309 -0
- flode/blocks/sources.py +215 -0
- flode/blocks/transport_delay.py +92 -0
- flode/blocks/userfunc.py +359 -0
- flode/core/__init__.py +5 -0
- flode/core/block.py +497 -0
- flode/core/decorator.py +1149 -0
- flode/core/dtypes.py +1026 -0
- flode/core/identifiers.py +157 -0
- flode/core/persistence.py +1319 -0
- flode/core/simulator.py +1690 -0
- flode/exceptions.py +226 -0
- flode/libraries/__init__.py +341 -0
- flode/libraries/_loader.py +302 -0
- flode/libraries/std.flwlib.json +347 -0
- flode/server/__init__.py +23 -0
- flode/server/app.py +185 -0
- flode/server/cli.py +555 -0
- flode/server/config.py +516 -0
- flode/server/errors.py +397 -0
- flode/server/library_registry.py +125 -0
- flode/server/migrations/__init__.py +80 -0
- flode/server/registry.py +950 -0
- flode/server/registry_translations.py +804 -0
- flode/server/routes/__init__.py +16 -0
- flode/server/routes/blocks.py +447 -0
- flode/server/routes/files.py +800 -0
- flode/server/routes/libraries.py +129 -0
- flode/server/routes/models.py +67 -0
- flode/server/routes/simulations.py +355 -0
- flode/server/runtime.py +354 -0
- flode/server/security/__init__.py +7 -0
- flode/server/security/origin.py +122 -0
- flode/server/security/paths.py +143 -0
- flode/server/settings.py +42 -0
- flode/server/static/.app-version +1 -0
- flode/server/static/assets/index-BnL2nNOe.css +1 -0
- flode/server/static/assets/index-DMWZBAA_.js +100 -0
- flode/server/static/assets/index-DMWZBAA_.js.map +1 -0
- flode/server/static/favicon.ico +0 -0
- flode/server/static/favicon.svg +9 -0
- flode/server/static/index.html +15 -0
- flode/subsystems/__init__.py +20 -0
- flode/subsystems/_mask.py +154 -0
- flode/subsystems/control_blocks.py +245 -0
- flode/subsystems/ports.py +146 -0
- flode/subsystems/subsystem.py +1173 -0
- flode-0.60.3.dist-info/METADATA +91 -0
- flode-0.60.3.dist-info/RECORD +73 -0
- flode-0.60.3.dist-info/WHEEL +5 -0
- flode-0.60.3.dist-info/entry_points.txt +2 -0
- flode-0.60.3.dist-info/licenses/LICENSE +21 -0
- 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])
|