pySimBlocks 0.1.0__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 (262) hide show
  1. examples/advanced/hardware/block_diagram.py +162 -0
  2. examples/advanced/hardware/camera.py +93 -0
  3. examples/advanced/hardware/gui_emio.py +231 -0
  4. examples/advanced/hardware/lmi.py +69 -0
  5. examples/advanced/hardware/main.py +57 -0
  6. examples/advanced/hardware/parameters.py +54 -0
  7. examples/advanced/qp_problem/params.py +10 -0
  8. examples/advanced/qp_problem/run.py +14 -0
  9. examples/advanced/sofa/gui/finger/Finger.py +108 -0
  10. examples/advanced/sofa/gui/finger/FingerController.py +53 -0
  11. examples/advanced/sofa/gui/finger/parameters_auto.py +22 -0
  12. examples/advanced/sofa/gui/sofa_plant/run.py +14 -0
  13. examples/advanced/sofa/python/Finger.py +107 -0
  14. examples/advanced/sofa/python/FingerController.py +48 -0
  15. examples/advanced/sofa/python/closedloop.py +64 -0
  16. examples/advanced/sofa/python/openloop.py +58 -0
  17. examples/basics/algebraic_function/g.py +7 -0
  18. examples/basics/algebraic_function/run.py +14 -0
  19. examples/basics/dc_motor/gui/run.py +14 -0
  20. examples/basics/dc_motor/multiple_order.py +91 -0
  21. examples/basics/dc_motor/openloop.py +62 -0
  22. examples/basics/dc_motor/pi.py +99 -0
  23. examples/basics/dc_motor/pid.py +118 -0
  24. examples/basics/dc_motor/pid_block.py +82 -0
  25. examples/basics/dc_motor/pid_block_vs_manual.py +143 -0
  26. examples/basics/external/parameters.py +4 -0
  27. examples/basics/external/run.py +14 -0
  28. examples/basics/file_sources/temp.py +16 -0
  29. examples/basics/observer.py +76 -0
  30. examples/basics/state_feedback/gui/parameters.py +9 -0
  31. examples/basics/state_feedback/gui/run.py +14 -0
  32. examples/basics/state_feedback/state_feedback.py +102 -0
  33. examples/basics/state_space/linear/gui/run.py +14 -0
  34. examples/basics/state_space/linear/ss_block.py +89 -0
  35. examples/basics/state_space/linear/ss_manual.py +105 -0
  36. examples/basics/state_space/non_linear/nlss.py +47 -0
  37. examples/basics/state_space/non_linear/run.py +14 -0
  38. examples/basics/state_space/polytope/params.py +39 -0
  39. examples/basics/state_space/polytope/weights.py +12 -0
  40. examples/comparison/simulink/convert.py +29 -0
  41. examples/comparison/simulink/openloop.py +127 -0
  42. examples/comparison/simulink/pi.py +148 -0
  43. examples/comparison/simulink/pid.py +154 -0
  44. examples/comparison/simulink/pid_backward.py +155 -0
  45. examples/quick_start/filter.py +35 -0
  46. examples/quick_start/gui/run.py +14 -0
  47. examples/tutorials/tutorial_1_python/main.py +99 -0
  48. examples/tutorials/tutorial_3_sofa/finger/Finger.py +120 -0
  49. examples/tutorials/tutorial_3_sofa/finger/FingerController.py +37 -0
  50. pySimBlocks/__init__.py +35 -0
  51. pySimBlocks/blocks/__init__.py +68 -0
  52. pySimBlocks/blocks/controllers/__init__.py +27 -0
  53. pySimBlocks/blocks/controllers/pid.py +250 -0
  54. pySimBlocks/blocks/controllers/state_feedback.py +141 -0
  55. pySimBlocks/blocks/interfaces/__init__.py +27 -0
  56. pySimBlocks/blocks/interfaces/external_input.py +107 -0
  57. pySimBlocks/blocks/interfaces/external_output.py +113 -0
  58. pySimBlocks/blocks/observers/__init__.py +23 -0
  59. pySimBlocks/blocks/observers/luenberger.py +175 -0
  60. pySimBlocks/blocks/operators/__init__.py +47 -0
  61. pySimBlocks/blocks/operators/algebraic_function.py +258 -0
  62. pySimBlocks/blocks/operators/dead_zone.py +186 -0
  63. pySimBlocks/blocks/operators/delay.py +254 -0
  64. pySimBlocks/blocks/operators/demux.py +123 -0
  65. pySimBlocks/blocks/operators/discrete_derivator.py +237 -0
  66. pySimBlocks/blocks/operators/discrete_integrator.py +265 -0
  67. pySimBlocks/blocks/operators/gain.py +294 -0
  68. pySimBlocks/blocks/operators/mux.py +131 -0
  69. pySimBlocks/blocks/operators/product.py +194 -0
  70. pySimBlocks/blocks/operators/rate_limiter.py +214 -0
  71. pySimBlocks/blocks/operators/saturation.py +178 -0
  72. pySimBlocks/blocks/operators/sum.py +188 -0
  73. pySimBlocks/blocks/operators/zero_order_hold.py +141 -0
  74. pySimBlocks/blocks/optimizers/__init__.py +23 -0
  75. pySimBlocks/blocks/optimizers/quadratic_program.py +326 -0
  76. pySimBlocks/blocks/sources/__init__.py +37 -0
  77. pySimBlocks/blocks/sources/chirp.py +168 -0
  78. pySimBlocks/blocks/sources/constant.py +82 -0
  79. pySimBlocks/blocks/sources/file_source.py +294 -0
  80. pySimBlocks/blocks/sources/function_source.py +197 -0
  81. pySimBlocks/blocks/sources/ramp.py +99 -0
  82. pySimBlocks/blocks/sources/sinusoidal.py +113 -0
  83. pySimBlocks/blocks/sources/step.py +138 -0
  84. pySimBlocks/blocks/sources/white_noise.py +107 -0
  85. pySimBlocks/blocks/systems/__init__.py +27 -0
  86. pySimBlocks/blocks/systems/linear_state_space.py +180 -0
  87. pySimBlocks/blocks/systems/non_linear_state_space.py +309 -0
  88. pySimBlocks/blocks/systems/polytopic_state_space.py +193 -0
  89. pySimBlocks/blocks/systems/sofa/__init__.py +30 -0
  90. pySimBlocks/blocks/systems/sofa/sofa_controller.py +472 -0
  91. pySimBlocks/blocks/systems/sofa/sofa_exchange_i_o.py +120 -0
  92. pySimBlocks/blocks/systems/sofa/sofa_plant.py +306 -0
  93. pySimBlocks/cli.py +127 -0
  94. pySimBlocks/core/__init__.py +32 -0
  95. pySimBlocks/core/block.py +167 -0
  96. pySimBlocks/core/block_source.py +94 -0
  97. pySimBlocks/core/config.py +90 -0
  98. pySimBlocks/core/fixed_time_manager.py +46 -0
  99. pySimBlocks/core/model.py +250 -0
  100. pySimBlocks/core/scheduler.py +30 -0
  101. pySimBlocks/core/simulator.py +329 -0
  102. pySimBlocks/core/task.py +73 -0
  103. pySimBlocks/docs/blocks/controllers/pid.md +78 -0
  104. pySimBlocks/docs/blocks/controllers/state_feedback.md +60 -0
  105. pySimBlocks/docs/blocks/interfaces/external_input.md +39 -0
  106. pySimBlocks/docs/blocks/interfaces/external_output.md +39 -0
  107. pySimBlocks/docs/blocks/observers/luenberger.md +70 -0
  108. pySimBlocks/docs/blocks/operators/algebraic_function.md +76 -0
  109. pySimBlocks/docs/blocks/operators/dead_zone.md +67 -0
  110. pySimBlocks/docs/blocks/operators/delay.md +76 -0
  111. pySimBlocks/docs/blocks/operators/demux.md +64 -0
  112. pySimBlocks/docs/blocks/operators/discrete_derivator.md +61 -0
  113. pySimBlocks/docs/blocks/operators/discrete_integrator.md +87 -0
  114. pySimBlocks/docs/blocks/operators/gain.md +97 -0
  115. pySimBlocks/docs/blocks/operators/mux.md +64 -0
  116. pySimBlocks/docs/blocks/operators/product.md +51 -0
  117. pySimBlocks/docs/blocks/operators/rate_limiter.md +70 -0
  118. pySimBlocks/docs/blocks/operators/saturation.md +62 -0
  119. pySimBlocks/docs/blocks/operators/sum.md +49 -0
  120. pySimBlocks/docs/blocks/operators/zero_order_hold.md +61 -0
  121. pySimBlocks/docs/blocks/optimizers/quadratic_program.md +98 -0
  122. pySimBlocks/docs/blocks/sources/chirp.md +102 -0
  123. pySimBlocks/docs/blocks/sources/constant.md +53 -0
  124. pySimBlocks/docs/blocks/sources/file_source.md +51 -0
  125. pySimBlocks/docs/blocks/sources/function_source.md +52 -0
  126. pySimBlocks/docs/blocks/sources/ramp.md +58 -0
  127. pySimBlocks/docs/blocks/sources/sinusoidal.md +60 -0
  128. pySimBlocks/docs/blocks/sources/step.md +63 -0
  129. pySimBlocks/docs/blocks/sources/white_noise.md +58 -0
  130. pySimBlocks/docs/blocks/systems/linear_state_space.md +66 -0
  131. pySimBlocks/docs/blocks/systems/non_linear_state_space.md +90 -0
  132. pySimBlocks/docs/blocks/systems/polytopic_state_space.md +72 -0
  133. pySimBlocks/docs/blocks/systems/sofa/sofa_exchange_i_o.md +63 -0
  134. pySimBlocks/docs/blocks/systems/sofa/sofa_plant.md +62 -0
  135. pySimBlocks/gui/__init__.py +20 -0
  136. pySimBlocks/gui/addons/__init__.py +19 -0
  137. pySimBlocks/gui/addons/sofa/__init__.py +19 -0
  138. pySimBlocks/gui/addons/sofa/sofa_dialog.py +190 -0
  139. pySimBlocks/gui/addons/sofa/sofa_service.py +209 -0
  140. pySimBlocks/gui/blocks/block_dialog_session.py +47 -0
  141. pySimBlocks/gui/blocks/block_meta.py +408 -0
  142. pySimBlocks/gui/blocks/controllers/pid.py +116 -0
  143. pySimBlocks/gui/blocks/controllers/state_feedback.py +80 -0
  144. pySimBlocks/gui/blocks/interfaces/external_input.py +64 -0
  145. pySimBlocks/gui/blocks/interfaces/external_output.py +63 -0
  146. pySimBlocks/gui/blocks/observers/luenberger.py +108 -0
  147. pySimBlocks/gui/blocks/operators/algebraic_function.py +232 -0
  148. pySimBlocks/gui/blocks/operators/dead_zone.py +79 -0
  149. pySimBlocks/gui/blocks/operators/delay.py +79 -0
  150. pySimBlocks/gui/blocks/operators/demux.py +98 -0
  151. pySimBlocks/gui/blocks/operators/discrete_derivator.py +67 -0
  152. pySimBlocks/gui/blocks/operators/discrete_integrator.py +80 -0
  153. pySimBlocks/gui/blocks/operators/gain.py +79 -0
  154. pySimBlocks/gui/blocks/operators/mux.py +100 -0
  155. pySimBlocks/gui/blocks/operators/product.py +109 -0
  156. pySimBlocks/gui/blocks/operators/rate_limiter.py +79 -0
  157. pySimBlocks/gui/blocks/operators/saturation.py +72 -0
  158. pySimBlocks/gui/blocks/operators/sum.py +91 -0
  159. pySimBlocks/gui/blocks/operators/zero_order_hold.py +64 -0
  160. pySimBlocks/gui/blocks/optimizers/quadratic_program.py +128 -0
  161. pySimBlocks/gui/blocks/parameter_meta.py +34 -0
  162. pySimBlocks/gui/blocks/port_meta.py +31 -0
  163. pySimBlocks/gui/blocks/sources/chirp.py +146 -0
  164. pySimBlocks/gui/blocks/sources/constant.py +63 -0
  165. pySimBlocks/gui/blocks/sources/file_source.py +196 -0
  166. pySimBlocks/gui/blocks/sources/function_source.py +202 -0
  167. pySimBlocks/gui/blocks/sources/ramp.py +73 -0
  168. pySimBlocks/gui/blocks/sources/sinusoidal.py +81 -0
  169. pySimBlocks/gui/blocks/sources/step.py +83 -0
  170. pySimBlocks/gui/blocks/sources/white_noise.py +70 -0
  171. pySimBlocks/gui/blocks/systems/linear_state_space.py +102 -0
  172. pySimBlocks/gui/blocks/systems/non_linear_state_space.py +233 -0
  173. pySimBlocks/gui/blocks/systems/polytopic_state_space.py +109 -0
  174. pySimBlocks/gui/blocks/systems/sofa/sofa_exchange_i_o.py +221 -0
  175. pySimBlocks/gui/blocks/systems/sofa/sofa_plant.py +220 -0
  176. pySimBlocks/gui/dialogs/__init__.py +19 -0
  177. pySimBlocks/gui/dialogs/block_dialog.py +125 -0
  178. pySimBlocks/gui/dialogs/display_yaml_dialog.py +89 -0
  179. pySimBlocks/gui/dialogs/help_dialog.py +39 -0
  180. pySimBlocks/gui/dialogs/plot_dialog.py +230 -0
  181. pySimBlocks/gui/dialogs/settings/plots.py +187 -0
  182. pySimBlocks/gui/dialogs/settings/project.py +146 -0
  183. pySimBlocks/gui/dialogs/settings/simulation.py +137 -0
  184. pySimBlocks/gui/dialogs/settings_dialog.py +88 -0
  185. pySimBlocks/gui/dialogs/unsaved_dialog.py +92 -0
  186. pySimBlocks/gui/editor.py +49 -0
  187. pySimBlocks/gui/graphics/__init__.py +29 -0
  188. pySimBlocks/gui/graphics/block_item.py +289 -0
  189. pySimBlocks/gui/graphics/connection_item.py +266 -0
  190. pySimBlocks/gui/graphics/port_item.py +153 -0
  191. pySimBlocks/gui/graphics/theme.py +119 -0
  192. pySimBlocks/gui/main_window.py +162 -0
  193. pySimBlocks/gui/models/__init__.py +31 -0
  194. pySimBlocks/gui/models/block_instance.py +114 -0
  195. pySimBlocks/gui/models/connection_instance.py +43 -0
  196. pySimBlocks/gui/models/port_instance.py +52 -0
  197. pySimBlocks/gui/models/project_simulation_params.py +50 -0
  198. pySimBlocks/gui/models/project_state.py +114 -0
  199. pySimBlocks/gui/project_controller.py +302 -0
  200. pySimBlocks/gui/services/__init__.py +20 -0
  201. pySimBlocks/gui/services/project_loader.py +381 -0
  202. pySimBlocks/gui/services/project_saver.py +68 -0
  203. pySimBlocks/gui/services/simulation_runner.py +66 -0
  204. pySimBlocks/gui/services/yaml_tools.py +261 -0
  205. pySimBlocks/gui/widgets/__init__.py +19 -0
  206. pySimBlocks/gui/widgets/block_list.py +131 -0
  207. pySimBlocks/gui/widgets/diagram_view.py +312 -0
  208. pySimBlocks/gui/widgets/toolbar_view.py +161 -0
  209. pySimBlocks/project/__init__.py +35 -0
  210. pySimBlocks/project/build_model.py +92 -0
  211. pySimBlocks/project/generate_run_script.py +109 -0
  212. pySimBlocks/project/generate_sofa_controller.py +215 -0
  213. pySimBlocks/project/load_project_config.py +197 -0
  214. pySimBlocks/project/load_simulation_config.py +166 -0
  215. pySimBlocks/project/load_simulator.py +45 -0
  216. pySimBlocks/project/plot_from_config.py +174 -0
  217. pySimBlocks/project/pySimBlocks_blocks_index.yaml +106 -0
  218. pySimBlocks/real_time/__init__.py +23 -0
  219. pySimBlocks/real_time/real_time_runner.py +148 -0
  220. pySimBlocks/tools/__init__.py +19 -0
  221. pySimBlocks/tools/blocks_registry.py +141 -0
  222. pySimBlocks/tools/generate_blocks_index.py +124 -0
  223. pysimblocks-0.1.0.dist-info/METADATA +180 -0
  224. pysimblocks-0.1.0.dist-info/RECORD +262 -0
  225. pysimblocks-0.1.0.dist-info/WHEEL +5 -0
  226. pysimblocks-0.1.0.dist-info/entry_points.txt +2 -0
  227. pysimblocks-0.1.0.dist-info/licenses/LICENSE.md +165 -0
  228. pysimblocks-0.1.0.dist-info/top_level.txt +3 -0
  229. tests/blocks/controllers/test_pid.py +143 -0
  230. tests/blocks/controllers/test_state_feedback.py +193 -0
  231. tests/blocks/observers/test_luenberger.py +225 -0
  232. tests/blocks/operators/test_algebraic_function.py +230 -0
  233. tests/blocks/operators/test_dead_zone.py +106 -0
  234. tests/blocks/operators/test_delay.py +167 -0
  235. tests/blocks/operators/test_demux.py +111 -0
  236. tests/blocks/operators/test_discrete_derivator.py +160 -0
  237. tests/blocks/operators/test_discrete_integrator.py +149 -0
  238. tests/blocks/operators/test_gain.py +182 -0
  239. tests/blocks/operators/test_mux.py +101 -0
  240. tests/blocks/operators/test_product.py +171 -0
  241. tests/blocks/operators/test_rate_limiter.py +166 -0
  242. tests/blocks/operators/test_saturation.py +157 -0
  243. tests/blocks/operators/test_sum.py +183 -0
  244. tests/blocks/operators/test_zero_order_hold.py +106 -0
  245. tests/blocks/sources/test_chirp.py +157 -0
  246. tests/blocks/sources/test_constant.py +55 -0
  247. tests/blocks/sources/test_file_source.py +185 -0
  248. tests/blocks/sources/test_function_source.py +135 -0
  249. tests/blocks/sources/test_ramp.py +110 -0
  250. tests/blocks/sources/test_sinusoidal.py +113 -0
  251. tests/blocks/sources/test_step.py +76 -0
  252. tests/blocks/sources/test_white_noise.py +108 -0
  253. tests/blocks/systems/test_linear_state_space.py +135 -0
  254. tests/blocks/systems/test_polytopic_state_space.py +133 -0
  255. tests/core/test_core_errors_and_determinism.py +82 -0
  256. tests/core/test_core_multirate_tasks.py +88 -0
  257. tests/core/test_core_two_phase_and_propagation.py +132 -0
  258. tests/gui/main_window_open_test.py +162 -0
  259. tests/gui/test_block_meta_param_cache.py +16 -0
  260. tests/gui/test_file_source_meta.py +17 -0
  261. tests/gui/test_function_source_meta.py +28 -0
  262. tests/regression/test_simulink_dc_motor.py +217 -0
@@ -0,0 +1,60 @@
1
+ # Sinusoidal
2
+
3
+ ## Summary
4
+
5
+ The **Sinusoidal** block generates sinusoidal signals with configurable
6
+ amplitude, frequency, phase and offset for each output dimension.
7
+
8
+ ---
9
+
10
+ ## Mathematical definition
11
+
12
+ For each output component $i$, the signal is defined as:
13
+
14
+ $$
15
+ y_i(t) = A_i \sin(2\pi f_i t + \varphi_i) + o_i
16
+ $$
17
+
18
+ where:
19
+ - $A_i$ is the amplitude,
20
+ - $f_i$ is the frequency in Hertz,
21
+ - $\varphi_i$ is the phase shift,
22
+ - $o_i$ is the constant offset.
23
+
24
+ ---
25
+
26
+ ## Parameters
27
+
28
+ | Name | Type | Description | Optional |
29
+ |------------|-------------|-------------|-------------|
30
+ | `amplitude` | scalar or vector or matrix | Sinusoidal amplitude. Can be a scalar or vector. | False |
31
+ | `frequency` | scalar or vector or matrix | Sinusoidal frequency in Hertz. Can be a scalar or vector. | False |
32
+ | `phase` | scalar or vector or matrix | Phase shift in radians. Default is zero. | True |
33
+ | `offset` | scalar or vector or matrix | Constant offset added to the signal. Default is zero. | True |
34
+ | `sample_time` | float | Block sample time. If omitted, the global simulation time step is used. | True |
35
+
36
+ ---
37
+
38
+ ## Inputs
39
+
40
+ This block has **no inputs**.
41
+
42
+ ---
43
+
44
+ ## Outputs
45
+
46
+ | Port | Description |
47
+ |------|------------|
48
+ | `out` | Constant output signal. |
49
+
50
+ ---
51
+
52
+ ## Notes
53
+
54
+ - The block has no internal state.
55
+ - Each output dimension may have its own frequency and phase.
56
+ - Scalar parameters are automatically broadcast.
57
+
58
+
59
+ ---
60
+ © 2026 Université de Lille & INRIA – Licensed under LGPL-3.0-or-later
@@ -0,0 +1,63 @@
1
+ # Step
2
+
3
+ ## Summary
4
+
5
+ The **Step** block generates a signal that switches from an initial value
6
+ to a final value at a specified time.
7
+
8
+ ---
9
+
10
+ ## Mathematical definition
11
+
12
+ The step signal is defined as:
13
+
14
+ $$
15
+ y(t) =
16
+ \begin{cases}
17
+ y_{\text{before}}, & t < t_0 \\
18
+ y_{\text{after}}, & t \geq t_0
19
+ \end{cases}
20
+ $$
21
+
22
+ where:
23
+ - $y_{\text{before}}$ is the value before the step,
24
+ - $y_{\text{after}}$ is the value after the step,
25
+ - $t_0$ is the step time.
26
+
27
+ ---
28
+
29
+ ## Parameters
30
+
31
+ | Name | Type | Description | Optional |
32
+ |------------|-------------|-------------|-------------|
33
+ | `value_before` | scalar or vector or matrix | Output value before the step time. Scalars are broadcast to all dimensions. | False |
34
+ | `value_after` | scalar or vector or matrix | Output value after the step time. Must have the same dimension as `value_before`. | False |
35
+ | `start_time` | float | Time at which the step occurs. | False |
36
+ | `sample_time` | float | Block sample time. If omitted, the global simulation time step is used. | True |
37
+
38
+ ---
39
+
40
+ ## Inputs
41
+
42
+ This block has **no inputs**.
43
+
44
+ ---
45
+
46
+ ## Outputs
47
+
48
+ | Port | Description |
49
+ |------|------------|
50
+ | `out` | Constant output signal. |
51
+
52
+ ---
53
+
54
+ ## Notes
55
+
56
+ - The block has no internal state.
57
+ - A small numerical tolerance is used to ensure consistent switching
58
+ behavior on discrete time grids.
59
+ - This block is typically used to generate reference signals.
60
+
61
+
62
+ ---
63
+ © 2026 Université de Lille & INRIA – Licensed under LGPL-3.0-or-later
@@ -0,0 +1,58 @@
1
+ # WhiteNoise
2
+
3
+ ## Summary
4
+
5
+ The **WhiteNoise** block generates independent Gaussian noise samples
6
+ for each output dimension at every simulation step.
7
+
8
+ ---
9
+
10
+ ## Mathematical definition
11
+
12
+ For each output component $i$, the signal is defined as:
13
+
14
+ $$
15
+ y_i(t) \sim \mathcal{N}(\mu_i, \sigma_i^2)
16
+ $$
17
+
18
+ where:
19
+ - $\mu_i$ is the mean,
20
+ - $\sigma_i$ is the standard deviation.
21
+
22
+ ---
23
+
24
+ ## Parameters
25
+
26
+ | Name | Type | Description | Optional |
27
+ |------------|-------------|-------------|-------------|
28
+ | `mean` | scalar or vector or matrix | Mean value of the noise. Scalars are broadcast to all dimensions. Default is zero. | True |
29
+ | `std` | scalar or vector or matrix | Standard deviation of the noise. Must be non-negative. Default is one. | True |
30
+ | `seed` | integer | Random seed for reproducibility. If provided, the noise sequence is deterministic. | True |
31
+ | `sample_time` | float | Block sample time. If omitted, the global simulation time step is used. | True |
32
+
33
+ ---
34
+
35
+ ## Inputs
36
+
37
+ This block has **no inputs**.
38
+
39
+ ---
40
+
41
+ ## Outputs
42
+
43
+ | Port | Description |
44
+ |------|------------|
45
+ | `out` | Gaussian noise output signal. |
46
+
47
+ ---
48
+
49
+ ## Notes
50
+
51
+ - The block has no internal state.
52
+ - Noise samples are drawn independently at each simulation step.
53
+ - Each output dimension may have a different mean and standard deviation.
54
+ - Scalar parameters are automatically broadcast.
55
+
56
+
57
+ ---
58
+ © 2026 Université de Lille & INRIA – Licensed under LGPL-3.0-or-later
@@ -0,0 +1,66 @@
1
+ # LinearStateSpace
2
+
3
+ ## Summary
4
+
5
+ The **LinearStateSpace** block implements a discrete-time linear state-space system without direct feedthrough.
6
+
7
+ ---
8
+
9
+ ## Mathematical definition
10
+
11
+ The system is defined by the equations:
12
+
13
+ $$
14
+ x[k+1] = A x[k] + B u[k]
15
+ $$
16
+
17
+ $$
18
+ y[k] = C x[k]
19
+ $$
20
+
21
+ where:
22
+ - $x[k]$ is the state vector,
23
+ - $u[k]$ is the input vector,
24
+ - $y[k]$ is the output vector.
25
+
26
+ ---
27
+
28
+ ## Parameters
29
+
30
+ | Name | Type | Description | Optional |
31
+ |------------|-------------|-------------|-------------|
32
+ | `A` | 2D array | State transition matrix of size (n, n). | False |
33
+ | `B` | 2D array | Input matrix of size (n, m). | False |
34
+ | `C` | 2D array | Output matrix of size (p, n). | False |
35
+ | `x0` | 1D array | Initial state vector of size (n,). If omitted, the state is initialized to zero. | True |
36
+ | `sample_time` | float | Block sample time. If omitted, the global simulation time step is used. | True |
37
+
38
+ ---
39
+
40
+ ## Inputs
41
+
42
+ | Port | Description |
43
+ |------|------------|
44
+ | `u` | Input vector. |
45
+
46
+ ---
47
+
48
+ ## Outputs
49
+
50
+ | Port | Description |
51
+ |------|------------|
52
+ | `x` | State vector. |
53
+ | `y` | Output vector. |
54
+
55
+ ---
56
+
57
+ ## Notes
58
+
59
+ - The block has internal state.
60
+ - The system is strictly proper (no direct feedthrough).
61
+ - Matrix $D$ is intentionally not supported to avoid algebraic loops.
62
+ - The output is computed from the current state.
63
+
64
+
65
+ ---
66
+ © 2026 Université de Lille & INRIA – Licensed under LGPL-3.0-or-later
@@ -0,0 +1,90 @@
1
+ # Non Linear State Space
2
+
3
+ ## Summary
4
+
5
+ The **NonLinearStateSpace** block represents a user-defined, discrete-time non linear
6
+ state-space system.
7
+
8
+ The system dynamics and outputs are defined by Python functions provided by the user,
9
+ while the block itself enforces a strict execution and data-flow contract compatible
10
+ with the pySimBlocks simulation semantics.
11
+
12
+ ---
13
+
14
+ ## Mathematical definition
15
+
16
+ The block represents a discrete-time system of the form:
17
+
18
+ $$
19
+ \begin{aligned}
20
+ x[k+1] &= f\bigl(t_k,\ \Delta t_k,\ x[k],\ u_1[k],\dots,u_m[k]\bigr) \\
21
+ y[k] &= g\bigl(t_k,\ \Delta t_k,\ x[k]\bigr)
22
+ \end{aligned}
23
+ $$
24
+
25
+ where:
26
+ - $ x[k] \in \mathbb{R}^n $ is the state vector,
27
+ - $ u_i[k] $ are the input signals,
28
+ - $ y[k] $ is the output signal,
29
+ - $ t_k $ is the current simulation time,
30
+ - $ \Delta t_k $ is the elapsed time since the previous activation.
31
+
32
+ The functions $ f $ and $ g $ are implemented by the user and executed at each
33
+ block activation.
34
+
35
+ ---
36
+
37
+ ## Parameters
38
+
39
+ | Name | Type | Description | Required |
40
+ |------|------|-------------|----------|
41
+ | `file_path` | string | Path to the Python file containing the user-defined functions. | Yes |
42
+ | `state_function_name` | string | Name of the state update function implementing $ f $. | Yes |
43
+ | `output_function_name` | string | Name of the output function implementing $ g $. | Yes |
44
+ | `input_keys` | list[string] | Names of the input ports $ u_1, \dots, u_m $. | Yes |
45
+ | `output_keys` | list[string] | Names of the output ports returned by the output function. | Yes |
46
+ | `x0` | vector | Initial state vector \(x[0]\). | Yes |
47
+ | `sample_time` | float | Execution period of the block. If omitted, the global simulation time step is used. | No |
48
+
49
+ ---
50
+
51
+ ## Inputs
52
+
53
+ Inputs are dynamically defined by `input_keys`.
54
+
55
+ - Each input must be connected.
56
+ - Each input is a NumPy array of shape $ (n,1) $.
57
+
58
+ ---
59
+
60
+ ## Outputs
61
+
62
+ Outputs are dynamically defined by `output_keys`.
63
+
64
+ - Each output is a NumPy array of shape $ (n,1) $.
65
+ - Outputs depend only on the current state (no direct feedthrough).
66
+
67
+ ---
68
+
69
+ ## Execution semantics
70
+
71
+ - The block **has internal state**.
72
+ - The block **has no direct feedthrough**.
73
+ - Execution follows the standard two-phase discrete-time semantics:
74
+ 1. Outputs are computed from the current state.
75
+ 2. The next state is computed from the current state and current inputs.
76
+
77
+ ---
78
+
79
+ ## Notes
80
+
81
+ - This block provides a generic interface for embedding non linear models into a
82
+ block-diagram simulation.
83
+ - The numerical stability and correctness of the system are the responsibility of
84
+ the user-defined functions.
85
+ - Advanced users may instantiate this block directly from Python using callable
86
+ functions instead of file-based definitions.
87
+
88
+
89
+ ---
90
+ © 2026 Université de Lille & INRIA – Licensed under LGPL-3.0-or-later
@@ -0,0 +1,72 @@
1
+ # PolytopicStateSpace
2
+
3
+ ## Summary
4
+
5
+ The **PolytopicStateSpace** block implements a discrete-time polytopic state-space model without direct feedthrough.
6
+
7
+ ---
8
+
9
+ ## Mathematical definition
10
+
11
+ The system is defined by:
12
+
13
+ $$
14
+ x[k+1] = \sum_{i=1}^{r} w_i[k] (A_i x[k] + B_i u[k])
15
+ $$
16
+
17
+ $$
18
+ y[k] = C x[k]
19
+ $$
20
+
21
+ where:
22
+ - $x[k] \in \mathbb{R}^{nx}$ is the state vector,
23
+ - $u[k] \in \mathbb{R}^{nu}$ is the input vector,
24
+ - $w[k] \in \mathbb{R}^{r}$ is the vertex weight vector,
25
+ - $y[k] \in \mathbb{R}^{ny}$ is the output vector.
26
+
27
+ The block expects:
28
+ - $A \in \mathbb{R}^{nx \times (r\,nx)}$ as $[A_1 \ \cdots \ A_r]$,
29
+ - $B \in \mathbb{R}^{nx \times (r\,nu)}$ as $[B_1 \ \cdots \ B_r]$,
30
+ - $C \in \mathbb{R}^{ny \times nx}$.
31
+
32
+ ---
33
+
34
+ ## Parameters
35
+
36
+ | Name | Type | Description | Optional |
37
+ |------------|-------------|-------------|-------------|
38
+ | `A` | 2D array | Stacked state matrix of size (nx, r*nx): `[A1, ..., Ar]`. | False |
39
+ | `B` | 2D array | Stacked input matrix of size (nx, r*nu): `[B1, ..., Br]`. | False |
40
+ | `C` | 2D array | Output matrix of size (ny, nx). | False |
41
+ | `x0` | 1D array | Initial state vector of size (nx,). If omitted, initialized to zero. | True |
42
+ | `sample_time` | float | Block sample time. If omitted, the global simulation time step is used. | True |
43
+
44
+ ---
45
+
46
+ ## Inputs
47
+
48
+ | Port | Description |
49
+ |------|------------|
50
+ | `w` | Weight vector of shape (r,1) (or `(r,)` as parameterized array). |
51
+ | `u` | Input vector of shape (nu,1). |
52
+
53
+ ---
54
+
55
+ ## Outputs
56
+
57
+ | Port | Description |
58
+ |------|------------|
59
+ | `x` | State vector of shape (nx,1). |
60
+ | `y` | Output vector of shape (ny,1). |
61
+
62
+ ---
63
+
64
+ ## Notes
65
+
66
+ - The block has internal state.
67
+ - The system is strictly proper (no direct feedthrough).
68
+ - Input dimensions are validated at runtime.
69
+
70
+
71
+ ---
72
+ © 2026 Université de Lille & INRIA – Licensed under LGPL-3.0-or-later
@@ -0,0 +1,63 @@
1
+ # SofaExchangeIO
2
+
3
+ ## Summary
4
+
5
+ The **SofaExchangeIO** block provides an interface between a pySimBlocks model
6
+ and an external SOFA controller by exposing dynamic input and output ports.
7
+
8
+ ---
9
+
10
+ ## Description
11
+
12
+ This block does **not** execute a SOFA simulation.
13
+ It must **only** be used when SOFA will be running the simulation loop.
14
+ It acts only as a data exchange interface between:
15
+
16
+ - a pySimBlocks control model, and
17
+ - a SOFA controller that provides inputs and consumes outputs.
18
+
19
+ The block is fully stateless and does not modify the signals it exchanges.
20
+
21
+ ---
22
+
23
+ ## Parameters
24
+
25
+ | Name | Type | Description | Required |
26
+ |------|------|-------------|----------|
27
+ | `scene_file` | string | Path to the SOFA scene file to be simulated. | Yes |
28
+ | `input_keys` | list[string] | Names of the input ports $ u_1, \dots, u_m $. | Yes |
29
+ | `output_keys` | list[string] | Names of the output ports returned by the output function. | Yes |
30
+ | `sample_time` | float | Execution period of the block. If omitted, the global simulation time step is used. | No |
31
+
32
+ ---
33
+
34
+ ## Inputs
35
+
36
+ Inputs are dynamically defined by `input_keys`.
37
+
38
+ - Each input must be connected.
39
+ - Each input is a NumPy array of shape (n, 1).
40
+ - Each input corresponds to a command sent to the SOFA controller.
41
+
42
+ ---
43
+
44
+ ## Outputs
45
+
46
+ Outputs are dynamically defined by `output_keys`.
47
+
48
+ - Each output is a NumPy array of shape (n, 1).
49
+ - Each output corresponds to a measurement extracted from the SOFA scene.
50
+ - Each output is produced by the pySimBlocks controller logic.
51
+
52
+ ---
53
+
54
+ ## Notes
55
+
56
+ - This block does not run a SOFA simulation.
57
+ - It is intended to be embedded inside a SOFA controller.
58
+ - The block has no internal state.
59
+ - All data validation is performed at runtime.
60
+
61
+
62
+ ---
63
+ © 2026 Université de Lille & INRIA – Licensed under LGPL-3.0-or-later
@@ -0,0 +1,62 @@
1
+ # SofaPlant
2
+
3
+ ## Description
4
+
5
+ The **SofaPlant** block embeds a [SOFA](https://www.sofa-framework.org/) simulation as a dynamic system inside a pySimBlocks model.
6
+
7
+ Unlike *SofaExchangeIO*, which is used inside a SOFA controller, **SofaPlant runs the SOFA simulation itself** in a separate worker process and exposes it as a discrete-time plant.
8
+ However, this block can be used in a diagram that will be run in both simulations with pySimBlocks as master and SOFA as master. In the second case, the block is automatically replaced by a *SofaExchangeIO* block.
9
+
10
+ At each simulation step:
11
+ - control inputs are sent to SOFA,
12
+ - the scene advances by one time increment,
13
+ - updated outputs are returned to pySimBlocks.
14
+
15
+ ## Mathematical abstraction
16
+
17
+ The block can be seen as a discrete-time nonlinear system:
18
+
19
+ $$
20
+ y[k+1] = \mathcal{F}_{\text{SOFA}}(y[k], u[k])
21
+ $$
22
+
23
+ where:
24
+ - $ u[k] $ are the inputs defined by `input_keys`,
25
+ - $ y[k] $ are the outputs defined by `output_keys`,
26
+ - $ \mathcal{F}_{\text{SOFA}} $ represents one SOFA simulation step.
27
+
28
+ ---
29
+
30
+ ## Parameters
31
+
32
+ | Name | Type | Description | Required |
33
+ |------|------|-------------|----------|
34
+ | `scene_file` | string | Path to the SOFA scene file to be simulated. | Yes |
35
+ | `input_keys` | list[string] | Names of the input ports $ u_1, \dots, u_m $. | Yes |
36
+ | `output_keys` | list[string] | Names of the output ports returned by the output function. | Yes |
37
+ | `sample_time` | float | Execution period of the block. If omitted, the global simulation time step is used. | No |
38
+
39
+ ## Inputs
40
+
41
+ Inputs are dynamically defined by `input_keys`.
42
+
43
+ - Each input must be connected.
44
+ - Each input is a NumPy array of shape (n, 1).
45
+ - Each input corresponds to a command sent to the SOFA controller.
46
+
47
+ ## Outputs
48
+
49
+ Outputs are ynamically defined by `output_keys`.
50
+
51
+ - Each output is a NumPy array of shape (n, 1).
52
+ - Each output corresponds to a measurement extracted from the SOFA scene.
53
+
54
+ ## Execution semantics
55
+
56
+ - The block has internal state.
57
+ - There is no direct feedthrough.
58
+ - One SOFA simulation step is executed per block activation.
59
+
60
+
61
+ ---
62
+ © 2026 Université de Lille & INRIA – Licensed under LGPL-3.0-or-later
@@ -0,0 +1,20 @@
1
+ # ******************************************************************************
2
+ # pySimBlocks
3
+ # Copyright (c) 2026 Université de Lille & INRIA
4
+ # ******************************************************************************
5
+ # This program is free software: you can redistribute it and/or modify it
6
+ # under the terms of the GNU Lesser General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or (at your
8
+ # option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13
+ # for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ # ******************************************************************************
18
+ # Authors: see Authors.txt
19
+ # ******************************************************************************
20
+
@@ -0,0 +1,19 @@
1
+ # ******************************************************************************
2
+ # pySimBlocks
3
+ # Copyright (c) 2026 Université de Lille & INRIA
4
+ # ******************************************************************************
5
+ # This program is free software: you can redistribute it and/or modify it
6
+ # under the terms of the GNU Lesser General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or (at your
8
+ # option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13
+ # for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ # ******************************************************************************
18
+ # Authors: see Authors.txt
19
+ # ******************************************************************************
@@ -0,0 +1,19 @@
1
+ # ******************************************************************************
2
+ # pySimBlocks
3
+ # Copyright (c) 2026 Université de Lille & INRIA
4
+ # ******************************************************************************
5
+ # This program is free software: you can redistribute it and/or modify it
6
+ # under the terms of the GNU Lesser General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or (at your
8
+ # option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13
+ # for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ # ******************************************************************************
18
+ # Authors: see Authors.txt
19
+ # ******************************************************************************