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
@@ -0,0 +1,91 @@
1
+ Metadata-Version: 2.4
2
+ Name: flode
3
+ Version: 0.60.3
4
+ Summary: Block-diagram dynamic system simulator
5
+ Author: aramoto99
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/aramoto99/flode
8
+ Project-URL: Issues, https://github.com/aramoto99/flode/issues
9
+ Requires-Python: >=3.11
10
+ Description-Content-Type: text/markdown
11
+ License-File: LICENSE
12
+ Requires-Dist: numpy>=2.3
13
+ Requires-Dist: scipy>=1.10
14
+ Requires-Dist: matplotlib>=3.7
15
+ Requires-Dist: fastapi>=0.110
16
+ Requires-Dist: uvicorn[standard]>=0.27
17
+ Requires-Dist: websockets>=12
18
+ Requires-Dist: rapidfuzz>=3.6
19
+ Requires-Dist: pathspec>=0.12
20
+ Provides-Extra: dev
21
+ Requires-Dist: pytest>=7.0; extra == "dev"
22
+ Requires-Dist: pytest-cov>=4.0; extra == "dev"
23
+ Requires-Dist: pytest-mock>=3.0; extra == "dev"
24
+ Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
25
+ Requires-Dist: ruff>=0.5; extra == "dev"
26
+ Requires-Dist: mypy>=1.8; extra == "dev"
27
+ Requires-Dist: sphinx>=7.0; extra == "dev"
28
+ Requires-Dist: sphinx-rtd-theme>=2.0; extra == "dev"
29
+ Requires-Dist: httpx>=0.27; extra == "dev"
30
+ Requires-Dist: build>=1.2; extra == "dev"
31
+ Requires-Dist: control>=0.10; extra == "dev"
32
+ Provides-Extra: gui
33
+ Provides-Extra: control
34
+ Requires-Dist: control>=0.10; extra == "control"
35
+ Dynamic: license-file
36
+
37
+ # ブロック線図ベースの動的システムシミュレータ
38
+
39
+ [![CI](https://github.com/aramoto99/flode/actions/workflows/ci.yml/badge.svg)](https://github.com/aramoto99/flode/actions/workflows/ci.yml)
40
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
41
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue.svg)](pyproject.toml)
42
+
43
+ ![flode Web GUI — PI 制御ループを実行した画面](docs/images/readme_gui_pi_loop.png)
44
+
45
+ 上の画面のモデルは `examples/pi_control_demo.flw.json` (Step → Sum → PI 制御器 → プラント → Scope、単位フィードバック付き)。
46
+
47
+ ## インストール
48
+
49
+ 前提: **Python 3.11+**。ソースから入れる場合は **Node.js 20+** も必要。
50
+
51
+ ```bash
52
+ git clone https://github.com/aramoto99/flode.git
53
+ cd flode
54
+
55
+ # frontend をビルド (flode/server/static/ に出力される)
56
+ cd flode/web/frontend && npm install && npm run build && cd ../../..
57
+
58
+ pip install -e .
59
+ ```
60
+
61
+ ## 使い方
62
+
63
+ ### Web GUI
64
+
65
+ ```bash
66
+ flode # サーバ起動 + ブラウザが自動で開く
67
+ flode --workspace ./my-models --port 8770 # workspace とポートを指定
68
+ flode --no-browser # ブラウザを開かない
69
+ ```
70
+
71
+
72
+ ### Python API
73
+
74
+ ```python
75
+ from flode import Simulator
76
+ from flode.blocks import Constant, Gain, Integrator, Scope
77
+
78
+ sim = Simulator(t_end=10.0, dt=0.01)
79
+
80
+ src = sim.add(Constant(value=1.0, id="src"))
81
+ gain = sim.add(Gain(k=2.0, id="gain"))
82
+ integ = sim.add(Integrator(x0=0.0, id="integ"))
83
+ scope = sim.add(Scope(n_inputs=1, id="scope"))
84
+
85
+ sim.connect(src, gain)
86
+ sim.connect(gain, integ)
87
+ sim.connect(integ, scope)
88
+
89
+ sim.run()
90
+ scope.plot(show=True)
91
+ ```
@@ -0,0 +1,73 @@
1
+ flode/__init__.py,sha256=UF7jQE5OqFDCqPtcHwXpyn_2oi_w0uN22v_qAaT8ZhE,2347
2
+ flode/exceptions.py,sha256=2Ls4aG_Y8xAHunU1rbB8Yol1JiAh_KZMTb8X2i9wRoY,9157
3
+ flode/analysis/__init__.py,sha256=NtSehQDdKrMgW-gANvktPyguEpMOFrqswWX7edfINc0,1580
4
+ flode/analysis/frequency_response.py,sha256=Fmekv4yMRMqNdLwUnsW1gJPGPCMPpmPAJfhLWv73bas,13022
5
+ flode/analysis/linearize.py,sha256=FfHcK_t_YSVUbhaJydlOcv1YiwBAaXBrwwUb5whQbq8,29715
6
+ flode/analysis/stability.py,sha256=bnlzJpNJoLCnlXljCBjj-LMMMfbtGC-ZWfXYE7UDiBw,8573
7
+ flode/blocks/__init__.py,sha256=iudGkpk9dE_zuaZJuB6kwBkONvYpXp_LbyEFiQzl1bo,2158
8
+ flode/blocks/_lti_utils.py,sha256=0AkiUjzd-Qp_JuVyRAPuN84SDBBX1Fp8SKQT59J7zKo,4970
9
+ flode/blocks/cast.py,sha256=xjTz-3K0N9mltyzXorE0GcLFX23XQ7oESc-qvfe4N2k,2541
10
+ flode/blocks/continuous.py,sha256=CVsWUlcPWlUyEUovrayKERa8nWlMjIvrHRp-9AVhhRQ,19160
11
+ flode/blocks/discontinuities.py,sha256=kD1EWDHaZ0FCxwon-1SfSSucKWb_sN4l6YapEOUWcaA,10996
12
+ flode/blocks/discrete.py,sha256=Ghsi_zWaLGO-AIK656xe7CuQijl44iNX-3_31hRll4U,28171
13
+ flode/blocks/logic.py,sha256=sjqXU_661V2nfN9yJfnzJesIHC1qe-IytSATT3xWrpQ,4097
14
+ flode/blocks/lookup.py,sha256=RnlaC7aDfzAUcqzrJ41R7fEJcKtfZlbfU6xpHvaf0Js,45369
15
+ flode/blocks/mathops.py,sha256=PWTRAcZ92PpyEpthcGl94hnz5mUAUj_v-NOUeP6j3O0,22298
16
+ flode/blocks/pythonfunc.py,sha256=1xiFw7694Yeqer-s8Xez3wAbJGNKibipw-kAib90noo,25450
17
+ flode/blocks/pythonfunc_rewrite.py,sha256=OZ74OHfszUmRyltD01EqSnjLQvIkqVDSKHa2ucXYlxo,86347
18
+ flode/blocks/pythonfunc_source.py,sha256=mOgDXWxKDFJi_g0F2RezI1fz50UAU-vVQTlKNuSCxKo,16557
19
+ flode/blocks/random_source.py,sha256=MkApoTEgqX-5Kdc0PpFF4qah3BclOY6YhnkLePLctbw,8330
20
+ flode/blocks/rounding.py,sha256=K6i1VWwhdQcnQ_FsZcEMr078cAgSuONpV8aw6_6iFVI,2175
21
+ flode/blocks/routing.py,sha256=A3jpTsS-8mTnU9Coc0T-V7yyEXwsOBmJOI6CsVb_EfY,24231
22
+ flode/blocks/sinks.py,sha256=Bwf2Gq9DfYgHjJSRAg8I7VD93ueGubAUdWQ5ghTl1KI,12413
23
+ flode/blocks/sources.py,sha256=Xn-GBYeTOQjCI8eRqCEQPCeelRl14amrBWJZ8PkYHFE,7211
24
+ flode/blocks/transport_delay.py,sha256=5VItY_nptw3QSJo15gFRoGC-1UmqsgjcgRmhse3iKew,3669
25
+ flode/blocks/userfunc.py,sha256=bN1IRQmjCulhvkI76v_k88qrwUdViX-r3lCcCag4mfw,15599
26
+ flode/core/__init__.py,sha256=v5LQsbmDJ8f4iuvX0QaiMDYqGj6mHf06d8Wh_1XiFpY,130
27
+ flode/core/block.py,sha256=kXDCl2kcw0cKD4Fe0xTi3ZfGRQXdQUQxNJJpW_UQGq4,26070
28
+ flode/core/decorator.py,sha256=iiQu5sDDQQ42QtTmOes_NqyOe1Ajjp4yS_xEykPTCuM,47648
29
+ flode/core/dtypes.py,sha256=ChoiT_ZDddlrrE1JiV9EdiXNKiD13ZxFM-efeMs1dIE,42563
30
+ flode/core/identifiers.py,sha256=QlqraBmaxMBX259OoLzzHsGW1KBls6oCaf53Y0XfckQ,7333
31
+ flode/core/persistence.py,sha256=kC5RJ9noG1Xv45_tUquaWMklLTfL3JooU7x3FE5qJRQ,59679
32
+ flode/core/simulator.py,sha256=p_mbbedMsRwbCQiu2Xy8TITmCflBN6y0OQ3-VX5Rv2s,83639
33
+ flode/libraries/__init__.py,sha256=mapWoHzN4Q2ABS1K1HE0YVcZU-0MWXxrJ7sRvVsLhFk,14091
34
+ flode/libraries/_loader.py,sha256=rUeaEK4QYyjhpb8CWP4GcFgXmzC_bkT63ShuQBqIdeM,13268
35
+ flode/libraries/std.flwlib.json,sha256=oijyr00OK891D93pAgMVoHRVUChslYK39jV7UNtx0lU,9136
36
+ flode/server/__init__.py,sha256=OBjGcwp9ij-p9C0nvxH0eZNpP3hl8cFCheXpDFnx2ZU,717
37
+ flode/server/app.py,sha256=RnqnG6wt94LcF2KfWRJil_LeYij3g9kdaXSiEklzFBc,8321
38
+ flode/server/cli.py,sha256=_fPZjps7KA76HB69abneNoowy6__0O38Y6GyoCHVxak,22713
39
+ flode/server/config.py,sha256=GIftptty74IZJIWPZAk05M8c2LJK-34EltFlOlEDyUE,20889
40
+ flode/server/errors.py,sha256=uI1wtRP214Tn1NSmUhb0JjAcxSlnCavRB-88-Ju436w,16533
41
+ flode/server/library_registry.py,sha256=8mo-I27AQmAUKEJX1OpErl1TKTmTMt7LjjQp_-GzBl0,4803
42
+ flode/server/registry.py,sha256=2mz_NCIrz7bE6YPfuRM0h8t721lEoJwB_T6uTRIxnSk,42871
43
+ flode/server/registry_translations.py,sha256=siDgC2FOsIzNm2UGsgyAQ9sOujGed2dmqZ35cI439AM,32206
44
+ flode/server/runtime.py,sha256=vLCS4ky0SqpI_5xTvUnk6UvuQA0jSXSlN8S89v1hs0Q,15083
45
+ flode/server/settings.py,sha256=-t2dQlpMjevx5iJWRafkWbqThjr9bwD8XjmenMoY4nE,2348
46
+ flode/server/migrations/__init__.py,sha256=DukTNRdmSiNtmxQzlTyJvaNos_48CjnkYZK9UQQ9S_E,3143
47
+ flode/server/routes/__init__.py,sha256=QwJ4ct_kv34_QJhxj-wEiUoM1R1yupgGWeI0EuBEv34,543
48
+ flode/server/routes/blocks.py,sha256=PWEOCE3sIMZ6p2SV_WEW2Fb9uVFnl-qisgrv2_kKQ5E,19094
49
+ flode/server/routes/files.py,sha256=sswQna4jGkHwLnYJV7f2y1gL2GblnxRkmHu47vdQ9Sw,34124
50
+ flode/server/routes/libraries.py,sha256=RwMa0h2cGvh5_sFPI7V_EkwDMvQ1Ic8wfZEypgABhF8,5282
51
+ flode/server/routes/models.py,sha256=aRKA5TYPd-Mj7HvDRCdkCjouudxHVeZm02bm0NosFR0,2869
52
+ flode/server/routes/simulations.py,sha256=QOHqIqbWkA20M6PQtOxBLdVAbZSLFWoeJefU5YJlA-Q,14484
53
+ flode/server/security/__init__.py,sha256=EknOZ_BBnI8jeBO6iwlqEFo9xhCmhnSQUJv1blPIh1g,192
54
+ flode/server/security/origin.py,sha256=prHnOujPSrBejE4hGQCju7Ut9NY8MdymW7rDuSgu0fo,5337
55
+ flode/server/security/paths.py,sha256=P1HdwGU7wmujZo94fMp8T3ga3Y3FL0UU-kSY8-gwMSA,6969
56
+ flode/server/static/.app-version,sha256=chJfYa7etvF-MFA2V4XiSnpCrQjGz5VYdoEri3-y51A,7
57
+ flode/server/static/favicon.ico,sha256=zGyiZ0pACBiHPEfAl2m4iWxkZyDNsp1u_Ze6qEYbVYE,3139
58
+ flode/server/static/favicon.svg,sha256=5IuHbIIhGqZqSkHSGUKSHByRogERMUzAWIF7WRsoHSw,549
59
+ flode/server/static/index.html,sha256=7-O3RYd5X7SIv5RMlPHBA61DdZY-Cq7kVbvOtyrPCUk,535
60
+ flode/server/static/assets/index-BnL2nNOe.css,sha256=k_oYJDK91qnQBv13xH64k2y597OpdxvkNnM1rfwTzV4,47632
61
+ flode/server/static/assets/index-DMWZBAA_.js,sha256=GsC47I3tWIMTDxkEU3nGNNz3qdu7a2Efs3x1Bhiaaw4,912119
62
+ flode/server/static/assets/index-DMWZBAA_.js.map,sha256=YVBPwRwRgV5M8jHCaOHIaFL1jMCnsU1Srtq6nNBfyzM,3425636
63
+ flode/subsystems/__init__.py,sha256=WaG3gBVeOXjBvq39qABWUkCIy5tmTDWjlJyETCrBAo4,587
64
+ flode/subsystems/_mask.py,sha256=ecGcRn1fCxaoCWTvy121xsE1cag8vLV6gbKagw3dZ0E,5994
65
+ flode/subsystems/control_blocks.py,sha256=EiBVmYOqHNxrVJiy7OTFrCxQ3PeqfswGeJ04MCPJQRU,11059
66
+ flode/subsystems/ports.py,sha256=R95jmu3MKFdij_8OZz541RVn2uDvZHRVTGLxoUSoRTA,5934
67
+ flode/subsystems/subsystem.py,sha256=gNePMg545EnYTR94TqRthSB1pmXgggqDtrr3Z85MXX8,58505
68
+ flode-0.60.3.dist-info/licenses/LICENSE,sha256=F8ejPBX0pSzJVLp9LTBFRgXdrKKNVQ9oU1XoyIoFjCU,1066
69
+ flode-0.60.3.dist-info/METADATA,sha256=OP_IdZ-BZ-fgVC51DZBX9KoEee6PolWgQn2h2SLgjXw,2937
70
+ flode-0.60.3.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
71
+ flode-0.60.3.dist-info/entry_points.txt,sha256=D38DouJLF1pnv7FB60eKJtId3RnjS_9puZp4rLRzBIE,48
72
+ flode-0.60.3.dist-info/top_level.txt,sha256=UqNfR5JNKAfwuSFz4APG331xBEO0CkLuPV5U7soUmxA,6
73
+ flode-0.60.3.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ flode = flode.server.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 aramoto99
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ flode