tnfr 3.0.3__py3-none-any.whl → 8.5.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.

Potentially problematic release.


This version of tnfr might be problematic. Click here for more details.

Files changed (360) hide show
  1. tnfr/__init__.py +375 -56
  2. tnfr/__init__.pyi +33 -0
  3. tnfr/_compat.py +10 -0
  4. tnfr/_generated_version.py +34 -0
  5. tnfr/_version.py +49 -0
  6. tnfr/_version.pyi +7 -0
  7. tnfr/alias.py +723 -0
  8. tnfr/alias.pyi +108 -0
  9. tnfr/backends/__init__.py +354 -0
  10. tnfr/backends/jax_backend.py +173 -0
  11. tnfr/backends/numpy_backend.py +238 -0
  12. tnfr/backends/optimized_numpy.py +420 -0
  13. tnfr/backends/torch_backend.py +408 -0
  14. tnfr/cache.py +171 -0
  15. tnfr/cache.pyi +13 -0
  16. tnfr/cli/__init__.py +110 -0
  17. tnfr/cli/__init__.pyi +26 -0
  18. tnfr/cli/arguments.py +489 -0
  19. tnfr/cli/arguments.pyi +29 -0
  20. tnfr/cli/execution.py +914 -0
  21. tnfr/cli/execution.pyi +70 -0
  22. tnfr/cli/interactive_validator.py +614 -0
  23. tnfr/cli/utils.py +51 -0
  24. tnfr/cli/utils.pyi +7 -0
  25. tnfr/cli/validate.py +236 -0
  26. tnfr/compat/__init__.py +85 -0
  27. tnfr/compat/dataclass.py +136 -0
  28. tnfr/compat/jsonschema_stub.py +61 -0
  29. tnfr/compat/matplotlib_stub.py +73 -0
  30. tnfr/compat/numpy_stub.py +155 -0
  31. tnfr/config/__init__.py +224 -0
  32. tnfr/config/__init__.pyi +10 -0
  33. tnfr/config/constants.py +104 -0
  34. tnfr/config/constants.pyi +12 -0
  35. tnfr/config/defaults.py +54 -0
  36. tnfr/config/defaults_core.py +212 -0
  37. tnfr/config/defaults_init.py +33 -0
  38. tnfr/config/defaults_metric.py +104 -0
  39. tnfr/config/feature_flags.py +81 -0
  40. tnfr/config/feature_flags.pyi +16 -0
  41. tnfr/config/glyph_constants.py +31 -0
  42. tnfr/config/init.py +77 -0
  43. tnfr/config/init.pyi +8 -0
  44. tnfr/config/operator_names.py +254 -0
  45. tnfr/config/operator_names.pyi +36 -0
  46. tnfr/config/physics_derivation.py +354 -0
  47. tnfr/config/presets.py +83 -0
  48. tnfr/config/presets.pyi +7 -0
  49. tnfr/config/security.py +927 -0
  50. tnfr/config/thresholds.py +114 -0
  51. tnfr/config/tnfr_config.py +498 -0
  52. tnfr/constants/__init__.py +92 -0
  53. tnfr/constants/__init__.pyi +92 -0
  54. tnfr/constants/aliases.py +33 -0
  55. tnfr/constants/aliases.pyi +27 -0
  56. tnfr/constants/init.py +33 -0
  57. tnfr/constants/init.pyi +12 -0
  58. tnfr/constants/metric.py +104 -0
  59. tnfr/constants/metric.pyi +19 -0
  60. tnfr/core/__init__.py +33 -0
  61. tnfr/core/container.py +226 -0
  62. tnfr/core/default_implementations.py +329 -0
  63. tnfr/core/interfaces.py +279 -0
  64. tnfr/dynamics/__init__.py +238 -0
  65. tnfr/dynamics/__init__.pyi +83 -0
  66. tnfr/dynamics/adaptation.py +267 -0
  67. tnfr/dynamics/adaptation.pyi +7 -0
  68. tnfr/dynamics/adaptive_sequences.py +189 -0
  69. tnfr/dynamics/adaptive_sequences.pyi +14 -0
  70. tnfr/dynamics/aliases.py +23 -0
  71. tnfr/dynamics/aliases.pyi +19 -0
  72. tnfr/dynamics/bifurcation.py +232 -0
  73. tnfr/dynamics/canonical.py +229 -0
  74. tnfr/dynamics/canonical.pyi +48 -0
  75. tnfr/dynamics/coordination.py +385 -0
  76. tnfr/dynamics/coordination.pyi +25 -0
  77. tnfr/dynamics/dnfr.py +3034 -0
  78. tnfr/dynamics/dnfr.pyi +26 -0
  79. tnfr/dynamics/dynamic_limits.py +225 -0
  80. tnfr/dynamics/feedback.py +252 -0
  81. tnfr/dynamics/feedback.pyi +24 -0
  82. tnfr/dynamics/fused_dnfr.py +454 -0
  83. tnfr/dynamics/homeostasis.py +157 -0
  84. tnfr/dynamics/homeostasis.pyi +14 -0
  85. tnfr/dynamics/integrators.py +661 -0
  86. tnfr/dynamics/integrators.pyi +36 -0
  87. tnfr/dynamics/learning.py +310 -0
  88. tnfr/dynamics/learning.pyi +33 -0
  89. tnfr/dynamics/metabolism.py +254 -0
  90. tnfr/dynamics/nbody.py +796 -0
  91. tnfr/dynamics/nbody_tnfr.py +783 -0
  92. tnfr/dynamics/propagation.py +326 -0
  93. tnfr/dynamics/runtime.py +908 -0
  94. tnfr/dynamics/runtime.pyi +77 -0
  95. tnfr/dynamics/sampling.py +36 -0
  96. tnfr/dynamics/sampling.pyi +7 -0
  97. tnfr/dynamics/selectors.py +711 -0
  98. tnfr/dynamics/selectors.pyi +85 -0
  99. tnfr/dynamics/structural_clip.py +207 -0
  100. tnfr/errors/__init__.py +37 -0
  101. tnfr/errors/contextual.py +492 -0
  102. tnfr/execution.py +223 -0
  103. tnfr/execution.pyi +45 -0
  104. tnfr/extensions/__init__.py +205 -0
  105. tnfr/extensions/__init__.pyi +18 -0
  106. tnfr/extensions/base.py +173 -0
  107. tnfr/extensions/base.pyi +35 -0
  108. tnfr/extensions/business/__init__.py +71 -0
  109. tnfr/extensions/business/__init__.pyi +11 -0
  110. tnfr/extensions/business/cookbook.py +88 -0
  111. tnfr/extensions/business/cookbook.pyi +8 -0
  112. tnfr/extensions/business/health_analyzers.py +202 -0
  113. tnfr/extensions/business/health_analyzers.pyi +9 -0
  114. tnfr/extensions/business/patterns.py +183 -0
  115. tnfr/extensions/business/patterns.pyi +8 -0
  116. tnfr/extensions/medical/__init__.py +73 -0
  117. tnfr/extensions/medical/__init__.pyi +11 -0
  118. tnfr/extensions/medical/cookbook.py +88 -0
  119. tnfr/extensions/medical/cookbook.pyi +8 -0
  120. tnfr/extensions/medical/health_analyzers.py +181 -0
  121. tnfr/extensions/medical/health_analyzers.pyi +9 -0
  122. tnfr/extensions/medical/patterns.py +163 -0
  123. tnfr/extensions/medical/patterns.pyi +8 -0
  124. tnfr/flatten.py +262 -0
  125. tnfr/flatten.pyi +21 -0
  126. tnfr/gamma.py +354 -0
  127. tnfr/gamma.pyi +36 -0
  128. tnfr/glyph_history.py +377 -0
  129. tnfr/glyph_history.pyi +35 -0
  130. tnfr/glyph_runtime.py +19 -0
  131. tnfr/glyph_runtime.pyi +8 -0
  132. tnfr/immutable.py +218 -0
  133. tnfr/immutable.pyi +36 -0
  134. tnfr/initialization.py +203 -0
  135. tnfr/initialization.pyi +65 -0
  136. tnfr/io.py +10 -0
  137. tnfr/io.pyi +13 -0
  138. tnfr/locking.py +37 -0
  139. tnfr/locking.pyi +7 -0
  140. tnfr/mathematics/__init__.py +79 -0
  141. tnfr/mathematics/backend.py +453 -0
  142. tnfr/mathematics/backend.pyi +99 -0
  143. tnfr/mathematics/dynamics.py +408 -0
  144. tnfr/mathematics/dynamics.pyi +90 -0
  145. tnfr/mathematics/epi.py +391 -0
  146. tnfr/mathematics/epi.pyi +65 -0
  147. tnfr/mathematics/generators.py +242 -0
  148. tnfr/mathematics/generators.pyi +29 -0
  149. tnfr/mathematics/metrics.py +119 -0
  150. tnfr/mathematics/metrics.pyi +16 -0
  151. tnfr/mathematics/operators.py +239 -0
  152. tnfr/mathematics/operators.pyi +59 -0
  153. tnfr/mathematics/operators_factory.py +124 -0
  154. tnfr/mathematics/operators_factory.pyi +11 -0
  155. tnfr/mathematics/projection.py +87 -0
  156. tnfr/mathematics/projection.pyi +33 -0
  157. tnfr/mathematics/runtime.py +182 -0
  158. tnfr/mathematics/runtime.pyi +64 -0
  159. tnfr/mathematics/spaces.py +256 -0
  160. tnfr/mathematics/spaces.pyi +83 -0
  161. tnfr/mathematics/transforms.py +305 -0
  162. tnfr/mathematics/transforms.pyi +62 -0
  163. tnfr/metrics/__init__.py +79 -0
  164. tnfr/metrics/__init__.pyi +20 -0
  165. tnfr/metrics/buffer_cache.py +163 -0
  166. tnfr/metrics/buffer_cache.pyi +24 -0
  167. tnfr/metrics/cache_utils.py +214 -0
  168. tnfr/metrics/coherence.py +2009 -0
  169. tnfr/metrics/coherence.pyi +129 -0
  170. tnfr/metrics/common.py +158 -0
  171. tnfr/metrics/common.pyi +35 -0
  172. tnfr/metrics/core.py +316 -0
  173. tnfr/metrics/core.pyi +13 -0
  174. tnfr/metrics/diagnosis.py +833 -0
  175. tnfr/metrics/diagnosis.pyi +86 -0
  176. tnfr/metrics/emergence.py +245 -0
  177. tnfr/metrics/export.py +179 -0
  178. tnfr/metrics/export.pyi +7 -0
  179. tnfr/metrics/glyph_timing.py +379 -0
  180. tnfr/metrics/glyph_timing.pyi +81 -0
  181. tnfr/metrics/learning_metrics.py +280 -0
  182. tnfr/metrics/learning_metrics.pyi +21 -0
  183. tnfr/metrics/phase_coherence.py +351 -0
  184. tnfr/metrics/phase_compatibility.py +349 -0
  185. tnfr/metrics/reporting.py +183 -0
  186. tnfr/metrics/reporting.pyi +25 -0
  187. tnfr/metrics/sense_index.py +1203 -0
  188. tnfr/metrics/sense_index.pyi +9 -0
  189. tnfr/metrics/trig.py +373 -0
  190. tnfr/metrics/trig.pyi +13 -0
  191. tnfr/metrics/trig_cache.py +233 -0
  192. tnfr/metrics/trig_cache.pyi +10 -0
  193. tnfr/multiscale/__init__.py +32 -0
  194. tnfr/multiscale/hierarchical.py +517 -0
  195. tnfr/node.py +763 -0
  196. tnfr/node.pyi +139 -0
  197. tnfr/observers.py +255 -130
  198. tnfr/observers.pyi +31 -0
  199. tnfr/ontosim.py +144 -137
  200. tnfr/ontosim.pyi +28 -0
  201. tnfr/operators/__init__.py +1672 -0
  202. tnfr/operators/__init__.pyi +31 -0
  203. tnfr/operators/algebra.py +277 -0
  204. tnfr/operators/canonical_patterns.py +420 -0
  205. tnfr/operators/cascade.py +267 -0
  206. tnfr/operators/cycle_detection.py +358 -0
  207. tnfr/operators/definitions.py +4108 -0
  208. tnfr/operators/definitions.pyi +78 -0
  209. tnfr/operators/grammar.py +1164 -0
  210. tnfr/operators/grammar.pyi +140 -0
  211. tnfr/operators/hamiltonian.py +710 -0
  212. tnfr/operators/health_analyzer.py +809 -0
  213. tnfr/operators/jitter.py +272 -0
  214. tnfr/operators/jitter.pyi +11 -0
  215. tnfr/operators/lifecycle.py +314 -0
  216. tnfr/operators/metabolism.py +618 -0
  217. tnfr/operators/metrics.py +2138 -0
  218. tnfr/operators/network_analysis/__init__.py +27 -0
  219. tnfr/operators/network_analysis/source_detection.py +186 -0
  220. tnfr/operators/nodal_equation.py +395 -0
  221. tnfr/operators/pattern_detection.py +660 -0
  222. tnfr/operators/patterns.py +669 -0
  223. tnfr/operators/postconditions/__init__.py +38 -0
  224. tnfr/operators/postconditions/mutation.py +236 -0
  225. tnfr/operators/preconditions/__init__.py +1226 -0
  226. tnfr/operators/preconditions/coherence.py +305 -0
  227. tnfr/operators/preconditions/dissonance.py +236 -0
  228. tnfr/operators/preconditions/emission.py +128 -0
  229. tnfr/operators/preconditions/mutation.py +580 -0
  230. tnfr/operators/preconditions/reception.py +125 -0
  231. tnfr/operators/preconditions/resonance.py +364 -0
  232. tnfr/operators/registry.py +74 -0
  233. tnfr/operators/registry.pyi +9 -0
  234. tnfr/operators/remesh.py +1809 -0
  235. tnfr/operators/remesh.pyi +26 -0
  236. tnfr/operators/structural_units.py +268 -0
  237. tnfr/operators/unified_grammar.py +105 -0
  238. tnfr/parallel/__init__.py +54 -0
  239. tnfr/parallel/auto_scaler.py +234 -0
  240. tnfr/parallel/distributed.py +384 -0
  241. tnfr/parallel/engine.py +238 -0
  242. tnfr/parallel/gpu_engine.py +420 -0
  243. tnfr/parallel/monitoring.py +248 -0
  244. tnfr/parallel/partitioner.py +459 -0
  245. tnfr/py.typed +0 -0
  246. tnfr/recipes/__init__.py +22 -0
  247. tnfr/recipes/cookbook.py +743 -0
  248. tnfr/rng.py +178 -0
  249. tnfr/rng.pyi +26 -0
  250. tnfr/schemas/__init__.py +8 -0
  251. tnfr/schemas/grammar.json +94 -0
  252. tnfr/sdk/__init__.py +107 -0
  253. tnfr/sdk/__init__.pyi +19 -0
  254. tnfr/sdk/adaptive_system.py +173 -0
  255. tnfr/sdk/adaptive_system.pyi +21 -0
  256. tnfr/sdk/builders.py +370 -0
  257. tnfr/sdk/builders.pyi +51 -0
  258. tnfr/sdk/fluent.py +1121 -0
  259. tnfr/sdk/fluent.pyi +74 -0
  260. tnfr/sdk/templates.py +342 -0
  261. tnfr/sdk/templates.pyi +41 -0
  262. tnfr/sdk/utils.py +341 -0
  263. tnfr/secure_config.py +46 -0
  264. tnfr/security/__init__.py +70 -0
  265. tnfr/security/database.py +514 -0
  266. tnfr/security/subprocess.py +503 -0
  267. tnfr/security/validation.py +290 -0
  268. tnfr/selector.py +247 -0
  269. tnfr/selector.pyi +19 -0
  270. tnfr/sense.py +378 -0
  271. tnfr/sense.pyi +23 -0
  272. tnfr/services/__init__.py +17 -0
  273. tnfr/services/orchestrator.py +325 -0
  274. tnfr/sparse/__init__.py +39 -0
  275. tnfr/sparse/representations.py +492 -0
  276. tnfr/structural.py +705 -0
  277. tnfr/structural.pyi +83 -0
  278. tnfr/telemetry/__init__.py +35 -0
  279. tnfr/telemetry/cache_metrics.py +226 -0
  280. tnfr/telemetry/cache_metrics.pyi +64 -0
  281. tnfr/telemetry/nu_f.py +422 -0
  282. tnfr/telemetry/nu_f.pyi +108 -0
  283. tnfr/telemetry/verbosity.py +36 -0
  284. tnfr/telemetry/verbosity.pyi +15 -0
  285. tnfr/tokens.py +58 -0
  286. tnfr/tokens.pyi +36 -0
  287. tnfr/tools/__init__.py +20 -0
  288. tnfr/tools/domain_templates.py +478 -0
  289. tnfr/tools/sequence_generator.py +846 -0
  290. tnfr/topology/__init__.py +13 -0
  291. tnfr/topology/asymmetry.py +151 -0
  292. tnfr/trace.py +543 -0
  293. tnfr/trace.pyi +42 -0
  294. tnfr/tutorials/__init__.py +38 -0
  295. tnfr/tutorials/autonomous_evolution.py +285 -0
  296. tnfr/tutorials/interactive.py +1576 -0
  297. tnfr/tutorials/structural_metabolism.py +238 -0
  298. tnfr/types.py +775 -0
  299. tnfr/types.pyi +357 -0
  300. tnfr/units.py +68 -0
  301. tnfr/units.pyi +13 -0
  302. tnfr/utils/__init__.py +282 -0
  303. tnfr/utils/__init__.pyi +215 -0
  304. tnfr/utils/cache.py +4223 -0
  305. tnfr/utils/cache.pyi +470 -0
  306. tnfr/utils/callbacks.py +375 -0
  307. tnfr/utils/callbacks.pyi +49 -0
  308. tnfr/utils/chunks.py +108 -0
  309. tnfr/utils/chunks.pyi +22 -0
  310. tnfr/utils/data.py +428 -0
  311. tnfr/utils/data.pyi +74 -0
  312. tnfr/utils/graph.py +85 -0
  313. tnfr/utils/graph.pyi +10 -0
  314. tnfr/utils/init.py +821 -0
  315. tnfr/utils/init.pyi +80 -0
  316. tnfr/utils/io.py +559 -0
  317. tnfr/utils/io.pyi +66 -0
  318. tnfr/utils/numeric.py +114 -0
  319. tnfr/utils/numeric.pyi +21 -0
  320. tnfr/validation/__init__.py +257 -0
  321. tnfr/validation/__init__.pyi +85 -0
  322. tnfr/validation/compatibility.py +460 -0
  323. tnfr/validation/compatibility.pyi +6 -0
  324. tnfr/validation/config.py +73 -0
  325. tnfr/validation/graph.py +139 -0
  326. tnfr/validation/graph.pyi +18 -0
  327. tnfr/validation/input_validation.py +755 -0
  328. tnfr/validation/invariants.py +712 -0
  329. tnfr/validation/rules.py +253 -0
  330. tnfr/validation/rules.pyi +44 -0
  331. tnfr/validation/runtime.py +279 -0
  332. tnfr/validation/runtime.pyi +28 -0
  333. tnfr/validation/sequence_validator.py +162 -0
  334. tnfr/validation/soft_filters.py +170 -0
  335. tnfr/validation/soft_filters.pyi +32 -0
  336. tnfr/validation/spectral.py +164 -0
  337. tnfr/validation/spectral.pyi +42 -0
  338. tnfr/validation/validator.py +1266 -0
  339. tnfr/validation/window.py +39 -0
  340. tnfr/validation/window.pyi +1 -0
  341. tnfr/visualization/__init__.py +98 -0
  342. tnfr/visualization/cascade_viz.py +256 -0
  343. tnfr/visualization/hierarchy.py +284 -0
  344. tnfr/visualization/sequence_plotter.py +784 -0
  345. tnfr/viz/__init__.py +60 -0
  346. tnfr/viz/matplotlib.py +278 -0
  347. tnfr/viz/matplotlib.pyi +35 -0
  348. tnfr-8.5.0.dist-info/METADATA +573 -0
  349. tnfr-8.5.0.dist-info/RECORD +353 -0
  350. tnfr-8.5.0.dist-info/entry_points.txt +3 -0
  351. tnfr-3.0.3.dist-info/licenses/LICENSE.txt → tnfr-8.5.0.dist-info/licenses/LICENSE.md +1 -1
  352. tnfr/constants.py +0 -183
  353. tnfr/dynamics.py +0 -543
  354. tnfr/helpers.py +0 -198
  355. tnfr/main.py +0 -37
  356. tnfr/operators.py +0 -296
  357. tnfr-3.0.3.dist-info/METADATA +0 -35
  358. tnfr-3.0.3.dist-info/RECORD +0 -13
  359. {tnfr-3.0.3.dist-info → tnfr-8.5.0.dist-info}/WHEEL +0 -0
  360. {tnfr-3.0.3.dist-info → tnfr-8.5.0.dist-info}/top_level.txt +0 -0
tnfr/cli/__init__.pyi ADDED
@@ -0,0 +1,26 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from typing import Optional
5
+
6
+ from ..types import ProgramTokens, TNFRGraph
7
+
8
+ __all__: tuple[str, ...]
9
+
10
+ def main(argv: Optional[list[str]] = None) -> int: ...
11
+ def add_common_args(parser: argparse.ArgumentParser) -> None: ...
12
+ def add_grammar_args(parser: argparse.ArgumentParser) -> None: ...
13
+ def add_grammar_selector_args(parser: argparse.ArgumentParser) -> None: ...
14
+ def add_history_export_args(parser: argparse.ArgumentParser) -> None: ...
15
+ def add_canon_toggle(parser: argparse.ArgumentParser) -> None: ...
16
+ def build_basic_graph(args: argparse.Namespace) -> TNFRGraph: ...
17
+ def apply_cli_config(G: TNFRGraph, args: argparse.Namespace) -> None: ...
18
+ def register_callbacks_and_observer(G: TNFRGraph) -> None: ...
19
+ def resolve_program(
20
+ args: argparse.Namespace, default: Optional[ProgramTokens] = None
21
+ ) -> Optional[ProgramTokens]: ...
22
+ def run_program(
23
+ G: Optional[TNFRGraph],
24
+ program: Optional[ProgramTokens],
25
+ args: argparse.Namespace,
26
+ ) -> TNFRGraph: ...
tnfr/cli/arguments.py ADDED
@@ -0,0 +1,489 @@
1
+ """Argument parser helpers shared across TNFR CLI commands."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ from pathlib import Path
7
+ from typing import Any, Iterable
8
+
9
+ from ..config.presets import PREFERRED_PRESET_NAMES
10
+ from ..gamma import GAMMA_REGISTRY
11
+ from ..telemetry.verbosity import TELEMETRY_VERBOSITY_LEVELS
12
+ from ..types import ArgSpec
13
+ from .utils import spec
14
+
15
+ _PRESET_HELP = "Available presets: {}.".format(
16
+ ", ".join(PREFERRED_PRESET_NAMES),
17
+ )
18
+
19
+ TELEMETRY_VERBOSITY_CHOICES = TELEMETRY_VERBOSITY_LEVELS
20
+
21
+ GRAMMAR_ARG_SPECS: tuple[ArgSpec, ...] = (
22
+ spec("--grammar.enabled", action=argparse.BooleanOptionalAction),
23
+ spec("--grammar.zhir_requires_oz_window", type=int),
24
+ spec("--grammar.zhir_dnfr_min", type=float),
25
+ spec("--grammar.thol_min_len", type=int),
26
+ spec("--grammar.thol_max_len", type=int),
27
+ spec("--grammar.thol_close_dnfr", type=float),
28
+ spec("--grammar.si_high", type=float),
29
+ spec("--glyph.hysteresis_window", type=int),
30
+ )
31
+
32
+ # History export/save specifications
33
+ HISTORY_ARG_SPECS: tuple[ArgSpec, ...] = (
34
+ spec("--save-history", type=str),
35
+ spec("--export-history-base", type=str),
36
+ spec("--export-format", choices=["csv", "json"], default="json"),
37
+ )
38
+
39
+ # Arguments shared by CLI subcommands
40
+ COMMON_ARG_SPECS: tuple[ArgSpec, ...] = (
41
+ spec("--nodes", type=int, default=24),
42
+ spec("--topology", choices=["ring", "complete", "erdos"], default="ring"),
43
+ spec("--seed", type=int, default=1),
44
+ spec(
45
+ "--p",
46
+ type=float,
47
+ help="Edge probability when topology=erdos",
48
+ ),
49
+ spec("--observer", action="store_true", help="Attach standard observer"),
50
+ spec(
51
+ "--trace-verbosity",
52
+ choices=TELEMETRY_VERBOSITY_CHOICES,
53
+ help="Select the trace capture preset",
54
+ ),
55
+ spec(
56
+ "--metrics-verbosity",
57
+ choices=TELEMETRY_VERBOSITY_CHOICES,
58
+ help="Select the metrics capture preset",
59
+ ),
60
+ spec("--config", type=str),
61
+ spec("--dt", type=float),
62
+ spec("--integrator", choices=["euler", "rk4"]),
63
+ spec("--remesh-mode", choices=["knn", "mst", "community"]),
64
+ spec("--gamma-type", choices=list(GAMMA_REGISTRY.keys()), default="none"),
65
+ spec("--gamma-beta", type=float, default=0.0),
66
+ spec("--gamma-R0", type=float, default=0.0),
67
+ spec("--um-candidate-count", type=int),
68
+ spec("--stop-early-window", type=int),
69
+ spec("--stop-early-fraction", type=float),
70
+ )
71
+
72
+
73
+ def add_arg_specs(parser: argparse._ActionsContainer, specs: Iterable[ArgSpec]) -> None:
74
+ """Register arguments from ``specs`` on ``parser``."""
75
+ for opt, kwargs in specs:
76
+ parser.add_argument(opt, **kwargs)
77
+
78
+
79
+ def _args_to_dict(args: argparse.Namespace, prefix: str) -> dict[str, Any]:
80
+ """Extract arguments matching a prefix."""
81
+ return {
82
+ k.removeprefix(prefix): v
83
+ for k, v in vars(args).items()
84
+ if k.startswith(prefix) and v is not None
85
+ }
86
+
87
+
88
+ def add_common_args(parser: argparse.ArgumentParser) -> None:
89
+ """Add arguments shared across subcommands."""
90
+ add_arg_specs(parser, COMMON_ARG_SPECS)
91
+
92
+
93
+ def add_grammar_args(parser: argparse.ArgumentParser) -> None:
94
+ """Add grammar and structural operator hysteresis options."""
95
+ group = parser.add_argument_group("Grammar")
96
+ add_arg_specs(group, GRAMMAR_ARG_SPECS)
97
+
98
+
99
+ def add_grammar_selector_args(parser: argparse.ArgumentParser) -> None:
100
+ """Add grammar options and structural operator selector."""
101
+ add_grammar_args(parser)
102
+ parser.add_argument("--selector", choices=["basic", "param"], default="basic")
103
+
104
+
105
+ def add_history_export_args(parser: argparse.ArgumentParser) -> None:
106
+ """Add arguments to save or export history."""
107
+ add_arg_specs(parser, HISTORY_ARG_SPECS)
108
+
109
+
110
+ def add_canon_toggle(parser: argparse.ArgumentParser) -> None:
111
+ """Add option to disable canonical grammar."""
112
+ parser.add_argument(
113
+ "--no-canon",
114
+ dest="grammar_canon",
115
+ action="store_false",
116
+ default=True,
117
+ help="Disable canonical grammar",
118
+ )
119
+
120
+
121
+ def _add_run_parser(sub: argparse._SubParsersAction) -> None:
122
+ """Configure the ``run`` subcommand."""
123
+
124
+ from .execution import DEFAULT_SUMMARY_SERIES_LIMIT, cmd_run
125
+
126
+ p_run = sub.add_parser(
127
+ "run",
128
+ help=("Run a free scenario or preset and optionally export history"),
129
+ )
130
+ add_common_args(p_run)
131
+ p_run.add_argument("--steps", type=int, default=100)
132
+ p_run.add_argument(
133
+ "--use-Si",
134
+ dest="use_Si",
135
+ action=argparse.BooleanOptionalAction,
136
+ default=None,
137
+ help="Recompute the Sense Index during the run (use --no-use-Si to disable)",
138
+ )
139
+ p_run.add_argument(
140
+ "--apply-glyphs",
141
+ dest="apply_glyphs",
142
+ action=argparse.BooleanOptionalAction,
143
+ default=None,
144
+ help="Apply structural operators at every step (use --no-apply-glyphs to disable)",
145
+ )
146
+ p_run.add_argument(
147
+ "--dnfr-n-jobs",
148
+ dest="dnfr_n_jobs",
149
+ type=int,
150
+ help="Override ΔNFR parallel jobs forwarded to the runtime",
151
+ )
152
+ add_canon_toggle(p_run)
153
+ add_grammar_selector_args(p_run)
154
+ add_history_export_args(p_run)
155
+ p_run.add_argument("--preset", type=str, default=None, help=_PRESET_HELP)
156
+ p_run.add_argument("--sequence-file", type=str, default=None)
157
+ p_run.add_argument("--summary", action="store_true")
158
+ p_run.add_argument(
159
+ "--summary-limit",
160
+ type=int,
161
+ default=DEFAULT_SUMMARY_SERIES_LIMIT,
162
+ help=(
163
+ "Maximum number of samples per series in the summary (<=0 to"
164
+ " disable trimming)"
165
+ ),
166
+ )
167
+
168
+ math_group = p_run.add_argument_group("Mathematical dynamics")
169
+ math_group.add_argument(
170
+ "--math-engine",
171
+ action=argparse.BooleanOptionalAction,
172
+ default=False,
173
+ help=(
174
+ "Enable the spectral mathematical dynamics engine to project nodes"
175
+ " onto Hilbert space vectors and validate norm, coherence and"
176
+ " structural frequency invariants"
177
+ ),
178
+ )
179
+ math_group.add_argument(
180
+ "--math-dimension",
181
+ type=int,
182
+ help="Hilbert space dimension to use when the math engine is enabled",
183
+ )
184
+ math_group.add_argument(
185
+ "--math-coherence-spectrum",
186
+ type=float,
187
+ nargs="+",
188
+ metavar="λ",
189
+ help=(
190
+ "Eigenvalues for the coherence operator (defaults to a flat"
191
+ " spectrum when omitted)"
192
+ ),
193
+ )
194
+ math_group.add_argument(
195
+ "--math-coherence-c-min",
196
+ type=float,
197
+ help="Explicit coherence floor C_min for the operator",
198
+ )
199
+ math_group.add_argument(
200
+ "--math-coherence-threshold",
201
+ type=float,
202
+ help="Coherence expectation threshold enforced during validation",
203
+ )
204
+ math_group.add_argument(
205
+ "--math-frequency-diagonal",
206
+ type=float,
207
+ nargs="+",
208
+ metavar="ν",
209
+ help=(
210
+ "Diagonal entries for the structural frequency operator"
211
+ " (defaults to the identity spectrum)"
212
+ ),
213
+ )
214
+ math_group.add_argument(
215
+ "--math-generator-diagonal",
216
+ type=float,
217
+ nargs="+",
218
+ metavar="ω",
219
+ help=(
220
+ "Diagonal ΔNFR generator used by the mathematical dynamics"
221
+ " engine (defaults to the null generator)"
222
+ ),
223
+ )
224
+
225
+ p_run.set_defaults(func=cmd_run)
226
+
227
+
228
+ def _add_sequence_parser(sub: argparse._SubParsersAction) -> None:
229
+ """Configure the ``sequence`` subcommand."""
230
+ from .execution import cmd_sequence
231
+
232
+ p_seq = sub.add_parser(
233
+ "sequence",
234
+ help="Execute a sequence (preset or YAML/JSON)",
235
+ formatter_class=argparse.RawDescriptionHelpFormatter,
236
+ epilog=(
237
+ "JSON sequence example:\n"
238
+ "[\n"
239
+ ' "A",\n'
240
+ ' {"WAIT": 1},\n'
241
+ ' {"THOL": {"body": ["A", {"WAIT": 2}], "repeat": 2}}\n'
242
+ "]"
243
+ ),
244
+ )
245
+ add_common_args(p_seq)
246
+ p_seq.add_argument("--preset", type=str, default=None, help=_PRESET_HELP)
247
+ p_seq.add_argument("--sequence-file", type=str, default=None)
248
+ add_history_export_args(p_seq)
249
+ add_grammar_args(p_seq)
250
+ p_seq.set_defaults(func=cmd_sequence)
251
+
252
+
253
+ def _add_metrics_parser(sub: argparse._SubParsersAction) -> None:
254
+ """Configure the ``metrics`` subcommand."""
255
+ from .execution import cmd_metrics
256
+
257
+ p_met = sub.add_parser("metrics", help="Run briefly and export key metrics")
258
+ add_common_args(p_met)
259
+ p_met.add_argument("--steps", type=int, default=None)
260
+ add_canon_toggle(p_met)
261
+ add_grammar_selector_args(p_met)
262
+ p_met.add_argument("--save", type=str, default=None)
263
+ p_met.add_argument(
264
+ "--summary-limit",
265
+ type=int,
266
+ default=None,
267
+ help=(
268
+ "Maximum number of samples per series in the summary (<=0 to"
269
+ " disable trimming)"
270
+ ),
271
+ )
272
+ p_met.set_defaults(func=cmd_metrics)
273
+
274
+
275
+ def _add_profile_parser(sub: argparse._SubParsersAction) -> None:
276
+ """Configure the ``profile-si`` subcommand."""
277
+
278
+ from .execution import cmd_profile_si
279
+
280
+ p_prof = sub.add_parser(
281
+ "profile-si",
282
+ help="Profile compute_Si with and without NumPy",
283
+ )
284
+ p_prof.add_argument("--nodes", type=int, default=240)
285
+ p_prof.add_argument("--chord-step", type=int, default=7)
286
+ p_prof.add_argument("--loops", type=int, default=5)
287
+ p_prof.add_argument("--output-dir", type=Path, default=Path("profiles"))
288
+ p_prof.add_argument("--format", choices=("pstats", "json"), default="pstats")
289
+ p_prof.add_argument("--sort", choices=("cumtime", "tottime"), default="cumtime")
290
+ p_prof.set_defaults(func=cmd_profile_si)
291
+
292
+
293
+ def _add_profile_pipeline_parser(sub: argparse._SubParsersAction) -> None:
294
+ """Configure the ``profile-pipeline`` subcommand."""
295
+
296
+ from .execution import cmd_profile_pipeline
297
+
298
+ p_profile = sub.add_parser(
299
+ "profile-pipeline",
300
+ help="Profile the Sense Index + ΔNFR pipeline",
301
+ )
302
+ p_profile.add_argument("--nodes", type=int, default=240, help="Number of nodes")
303
+ p_profile.add_argument(
304
+ "--edge-probability",
305
+ type=float,
306
+ default=0.32,
307
+ help="Probability passed to the Erdos-Renyi generator",
308
+ )
309
+ p_profile.add_argument(
310
+ "--loops",
311
+ type=int,
312
+ default=5,
313
+ help="How many times to execute the pipeline inside the profiler",
314
+ )
315
+ p_profile.add_argument(
316
+ "--seed",
317
+ type=int,
318
+ default=42,
319
+ help="Random seed used when generating the graph",
320
+ )
321
+ p_profile.add_argument(
322
+ "--output-dir",
323
+ type=Path,
324
+ default=Path("profiles"),
325
+ help="Directory where profiling artefacts will be written",
326
+ )
327
+ p_profile.add_argument(
328
+ "--sort",
329
+ choices=("cumtime", "tottime"),
330
+ default="cumtime",
331
+ help="Sort order applied to profiling rows",
332
+ )
333
+ p_profile.add_argument(
334
+ "--si-chunk-sizes",
335
+ nargs="+",
336
+ metavar="SIZE",
337
+ help="Chunk sizes forwarded to G.graph['SI_CHUNK_SIZE']; use 'auto' for heuristics",
338
+ )
339
+ p_profile.add_argument(
340
+ "--dnfr-chunk-sizes",
341
+ nargs="+",
342
+ metavar="SIZE",
343
+ help="Chunk sizes forwarded to G.graph['DNFR_CHUNK_SIZE']; use 'auto' for heuristics",
344
+ )
345
+ p_profile.add_argument(
346
+ "--si-workers",
347
+ nargs="+",
348
+ metavar="COUNT",
349
+ help="Worker counts forwarded to G.graph['SI_N_JOBS']; use 'auto' for serial runs",
350
+ )
351
+ p_profile.add_argument(
352
+ "--dnfr-workers",
353
+ nargs="+",
354
+ metavar="COUNT",
355
+ help="Worker counts forwarded to G.graph['DNFR_N_JOBS']; use 'auto' for defaults",
356
+ )
357
+ p_profile.set_defaults(func=cmd_profile_pipeline)
358
+
359
+
360
+ def _add_math_run_parser(sub: argparse._SubParsersAction) -> None:
361
+ """Configure the ``math.run`` subcommand."""
362
+ from .execution import cmd_math_run
363
+
364
+ p_math = sub.add_parser(
365
+ "math.run",
366
+ help="Run simulation with mathematical dynamics engine validation",
367
+ formatter_class=argparse.RawDescriptionHelpFormatter,
368
+ epilog=(
369
+ "Examples:\n"
370
+ " # Run with default math engine settings\n"
371
+ " tnfr math.run --nodes 24 --steps 100\n\n"
372
+ " # Run with custom Hilbert dimension\n"
373
+ " tnfr math.run --math-dimension 32 --steps 50\n\n"
374
+ " # Run with custom coherence spectrum\n"
375
+ " tnfr math.run --math-coherence-spectrum 1.0 0.8 0.6 --steps 100\n"
376
+ ),
377
+ )
378
+ add_common_args(p_math)
379
+ p_math.add_argument("--steps", type=int, default=100)
380
+ p_math.add_argument(
381
+ "--preset",
382
+ type=str,
383
+ default=None,
384
+ help=_PRESET_HELP,
385
+ )
386
+ p_math.add_argument("--sequence-file", type=str, default=None)
387
+ add_canon_toggle(p_math)
388
+ add_grammar_selector_args(p_math)
389
+ add_history_export_args(p_math)
390
+
391
+ # Math engine is always enabled for math.run
392
+ math_group = p_math.add_argument_group("Mathematical dynamics (always enabled)")
393
+ math_group.add_argument(
394
+ "--math-dimension",
395
+ type=int,
396
+ help="Hilbert space dimension",
397
+ )
398
+ math_group.add_argument(
399
+ "--math-coherence-spectrum",
400
+ type=float,
401
+ nargs="+",
402
+ metavar="λ",
403
+ help="Eigenvalues for the coherence operator",
404
+ )
405
+ math_group.add_argument(
406
+ "--math-coherence-c-min",
407
+ type=float,
408
+ help="Explicit coherence floor C_min",
409
+ )
410
+ math_group.add_argument(
411
+ "--math-coherence-threshold",
412
+ type=float,
413
+ help="Coherence threshold for validation",
414
+ )
415
+ math_group.add_argument(
416
+ "--math-frequency-diagonal",
417
+ type=float,
418
+ nargs="+",
419
+ metavar="ν",
420
+ help="Diagonal entries for the frequency operator",
421
+ )
422
+ math_group.add_argument(
423
+ "--math-generator-diagonal",
424
+ type=float,
425
+ nargs="+",
426
+ metavar="ω",
427
+ help="ΔNFR generator diagonal",
428
+ )
429
+
430
+ p_math.set_defaults(func=cmd_math_run)
431
+
432
+
433
+ def _add_epi_validate_parser(sub: argparse._SubParsersAction) -> None:
434
+ """Configure the ``epi.validate`` subcommand."""
435
+ from .execution import cmd_epi_validate
436
+
437
+ p_epi = sub.add_parser(
438
+ "epi.validate",
439
+ help="Validate EPI structural integrity and coherence",
440
+ formatter_class=argparse.RawDescriptionHelpFormatter,
441
+ epilog=(
442
+ "Examples:\n"
443
+ " # Validate a preset\n"
444
+ " tnfr epi.validate --preset resonant_bootstrap\n\n"
445
+ " # Validate with custom topology\n"
446
+ " tnfr epi.validate --nodes 48 --topology complete\n\n"
447
+ " # Validate from sequence file\n"
448
+ " tnfr epi.validate --sequence-file presets/resonant_bootstrap.yaml\n"
449
+ ),
450
+ )
451
+ add_common_args(p_epi)
452
+ p_epi.add_argument("--steps", type=int, default=50)
453
+ p_epi.add_argument(
454
+ "--preset",
455
+ type=str,
456
+ default=None,
457
+ help=_PRESET_HELP,
458
+ )
459
+ p_epi.add_argument("--sequence-file", type=str, default=None)
460
+ add_canon_toggle(p_epi)
461
+ add_grammar_selector_args(p_epi)
462
+
463
+ validation_group = p_epi.add_argument_group("Validation options")
464
+ validation_group.add_argument(
465
+ "--check-coherence",
466
+ action="store_true",
467
+ default=True,
468
+ help="Validate coherence preservation (enabled by default)",
469
+ )
470
+ validation_group.add_argument(
471
+ "--check-frequency",
472
+ action="store_true",
473
+ default=True,
474
+ help="Validate structural frequency positivity (enabled by default)",
475
+ )
476
+ validation_group.add_argument(
477
+ "--check-phase",
478
+ action="store_true",
479
+ default=True,
480
+ help="Validate phase synchrony in couplings (enabled by default)",
481
+ )
482
+ validation_group.add_argument(
483
+ "--tolerance",
484
+ type=float,
485
+ default=1e-6,
486
+ help="Numerical tolerance for validation checks",
487
+ )
488
+
489
+ p_epi.set_defaults(func=cmd_epi_validate)
tnfr/cli/arguments.pyi ADDED
@@ -0,0 +1,29 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from typing import Any, Iterable
5
+
6
+ from ..gamma import GAMMA_REGISTRY
7
+ from ..types import ArgSpec
8
+ from .utils import spec
9
+
10
+ GRAMMAR_ARG_SPECS: tuple[ArgSpec, ...]
11
+ HISTORY_ARG_SPECS: tuple[ArgSpec, ...]
12
+ COMMON_ARG_SPECS: tuple[ArgSpec, ...]
13
+
14
+ def add_arg_specs(
15
+ parser: argparse._ActionsContainer, specs: Iterable[ArgSpec]
16
+ ) -> None: ...
17
+ def _args_to_dict(args: argparse.Namespace, prefix: str) -> dict[str, Any]: ...
18
+ def add_common_args(parser: argparse.ArgumentParser) -> None: ...
19
+ def add_grammar_args(parser: argparse.ArgumentParser) -> None: ...
20
+ def add_grammar_selector_args(parser: argparse.ArgumentParser) -> None: ...
21
+ def add_history_export_args(parser: argparse.ArgumentParser) -> None: ...
22
+ def add_canon_toggle(parser: argparse.ArgumentParser) -> None: ...
23
+ def _add_run_parser(sub: argparse._SubParsersAction) -> None: ...
24
+ def _add_sequence_parser(sub: argparse._SubParsersAction) -> None: ...
25
+ def _add_metrics_parser(sub: argparse._SubParsersAction) -> None: ...
26
+ def _add_profile_parser(sub: argparse._SubParsersAction) -> None: ...
27
+ def _add_profile_pipeline_parser(sub: argparse._SubParsersAction) -> None: ...
28
+ def _add_math_run_parser(sub: argparse._SubParsersAction) -> None: ...
29
+ def _add_epi_validate_parser(sub: argparse._SubParsersAction) -> None: ...