tnfr 6.0.0__py3-none-any.whl → 7.0.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 (176) hide show
  1. tnfr/__init__.py +50 -5
  2. tnfr/__init__.pyi +0 -7
  3. tnfr/_compat.py +0 -1
  4. tnfr/_generated_version.py +34 -0
  5. tnfr/_version.py +44 -2
  6. tnfr/alias.py +14 -13
  7. tnfr/alias.pyi +5 -37
  8. tnfr/cache.py +9 -729
  9. tnfr/cache.pyi +8 -224
  10. tnfr/callback_utils.py +16 -31
  11. tnfr/callback_utils.pyi +3 -29
  12. tnfr/cli/__init__.py +17 -11
  13. tnfr/cli/__init__.pyi +0 -21
  14. tnfr/cli/arguments.py +175 -14
  15. tnfr/cli/arguments.pyi +5 -11
  16. tnfr/cli/execution.py +434 -48
  17. tnfr/cli/execution.pyi +14 -24
  18. tnfr/cli/utils.py +20 -3
  19. tnfr/cli/utils.pyi +5 -5
  20. tnfr/config/__init__.py +2 -1
  21. tnfr/config/__init__.pyi +2 -0
  22. tnfr/config/feature_flags.py +83 -0
  23. tnfr/config/init.py +1 -1
  24. tnfr/config/operator_names.py +1 -14
  25. tnfr/config/presets.py +6 -26
  26. tnfr/constants/__init__.py +10 -13
  27. tnfr/constants/__init__.pyi +10 -22
  28. tnfr/constants/aliases.py +31 -0
  29. tnfr/constants/core.py +4 -3
  30. tnfr/constants/init.py +1 -1
  31. tnfr/constants/metric.py +3 -3
  32. tnfr/dynamics/__init__.py +64 -10
  33. tnfr/dynamics/__init__.pyi +3 -4
  34. tnfr/dynamics/adaptation.py +79 -13
  35. tnfr/dynamics/aliases.py +10 -9
  36. tnfr/dynamics/coordination.py +77 -35
  37. tnfr/dynamics/dnfr.py +575 -274
  38. tnfr/dynamics/dnfr.pyi +1 -10
  39. tnfr/dynamics/integrators.py +47 -33
  40. tnfr/dynamics/integrators.pyi +0 -1
  41. tnfr/dynamics/runtime.py +489 -129
  42. tnfr/dynamics/sampling.py +2 -0
  43. tnfr/dynamics/selectors.py +101 -62
  44. tnfr/execution.py +15 -8
  45. tnfr/execution.pyi +5 -25
  46. tnfr/flatten.py +7 -3
  47. tnfr/flatten.pyi +1 -8
  48. tnfr/gamma.py +22 -26
  49. tnfr/gamma.pyi +0 -6
  50. tnfr/glyph_history.py +37 -26
  51. tnfr/glyph_history.pyi +1 -19
  52. tnfr/glyph_runtime.py +16 -0
  53. tnfr/glyph_runtime.pyi +9 -0
  54. tnfr/immutable.py +20 -15
  55. tnfr/immutable.pyi +4 -7
  56. tnfr/initialization.py +5 -7
  57. tnfr/initialization.pyi +1 -9
  58. tnfr/io.py +6 -305
  59. tnfr/io.pyi +13 -8
  60. tnfr/mathematics/__init__.py +81 -0
  61. tnfr/mathematics/backend.py +426 -0
  62. tnfr/mathematics/dynamics.py +398 -0
  63. tnfr/mathematics/epi.py +254 -0
  64. tnfr/mathematics/generators.py +222 -0
  65. tnfr/mathematics/metrics.py +119 -0
  66. tnfr/mathematics/operators.py +233 -0
  67. tnfr/mathematics/operators_factory.py +71 -0
  68. tnfr/mathematics/projection.py +78 -0
  69. tnfr/mathematics/runtime.py +173 -0
  70. tnfr/mathematics/spaces.py +247 -0
  71. tnfr/mathematics/transforms.py +292 -0
  72. tnfr/metrics/__init__.py +10 -10
  73. tnfr/metrics/coherence.py +123 -94
  74. tnfr/metrics/common.py +22 -13
  75. tnfr/metrics/common.pyi +42 -11
  76. tnfr/metrics/core.py +72 -14
  77. tnfr/metrics/diagnosis.py +48 -57
  78. tnfr/metrics/diagnosis.pyi +3 -7
  79. tnfr/metrics/export.py +3 -5
  80. tnfr/metrics/glyph_timing.py +41 -31
  81. tnfr/metrics/reporting.py +13 -6
  82. tnfr/metrics/sense_index.py +884 -114
  83. tnfr/metrics/trig.py +167 -11
  84. tnfr/metrics/trig.pyi +1 -0
  85. tnfr/metrics/trig_cache.py +112 -15
  86. tnfr/node.py +400 -17
  87. tnfr/node.pyi +55 -38
  88. tnfr/observers.py +111 -8
  89. tnfr/observers.pyi +0 -15
  90. tnfr/ontosim.py +9 -6
  91. tnfr/ontosim.pyi +0 -5
  92. tnfr/operators/__init__.py +529 -42
  93. tnfr/operators/__init__.pyi +14 -0
  94. tnfr/operators/definitions.py +350 -18
  95. tnfr/operators/definitions.pyi +0 -14
  96. tnfr/operators/grammar.py +760 -0
  97. tnfr/operators/jitter.py +28 -22
  98. tnfr/operators/registry.py +7 -12
  99. tnfr/operators/registry.pyi +0 -2
  100. tnfr/operators/remesh.py +38 -61
  101. tnfr/rng.py +17 -300
  102. tnfr/schemas/__init__.py +8 -0
  103. tnfr/schemas/grammar.json +94 -0
  104. tnfr/selector.py +3 -4
  105. tnfr/selector.pyi +1 -1
  106. tnfr/sense.py +22 -24
  107. tnfr/sense.pyi +0 -7
  108. tnfr/structural.py +504 -21
  109. tnfr/structural.pyi +41 -18
  110. tnfr/telemetry/__init__.py +23 -1
  111. tnfr/telemetry/cache_metrics.py +226 -0
  112. tnfr/telemetry/nu_f.py +423 -0
  113. tnfr/telemetry/nu_f.pyi +123 -0
  114. tnfr/tokens.py +1 -4
  115. tnfr/tokens.pyi +1 -6
  116. tnfr/trace.py +20 -53
  117. tnfr/trace.pyi +9 -37
  118. tnfr/types.py +244 -15
  119. tnfr/types.pyi +200 -14
  120. tnfr/units.py +69 -0
  121. tnfr/units.pyi +16 -0
  122. tnfr/utils/__init__.py +107 -48
  123. tnfr/utils/__init__.pyi +80 -11
  124. tnfr/utils/cache.py +1705 -65
  125. tnfr/utils/cache.pyi +370 -58
  126. tnfr/utils/chunks.py +104 -0
  127. tnfr/utils/chunks.pyi +21 -0
  128. tnfr/utils/data.py +95 -5
  129. tnfr/utils/data.pyi +8 -17
  130. tnfr/utils/graph.py +2 -4
  131. tnfr/utils/init.py +31 -7
  132. tnfr/utils/init.pyi +4 -11
  133. tnfr/utils/io.py +313 -14
  134. tnfr/{helpers → utils}/numeric.py +50 -24
  135. tnfr/utils/numeric.pyi +21 -0
  136. tnfr/validation/__init__.py +92 -4
  137. tnfr/validation/__init__.pyi +77 -17
  138. tnfr/validation/compatibility.py +79 -43
  139. tnfr/validation/compatibility.pyi +4 -6
  140. tnfr/validation/grammar.py +55 -133
  141. tnfr/validation/grammar.pyi +37 -8
  142. tnfr/validation/graph.py +138 -0
  143. tnfr/validation/graph.pyi +17 -0
  144. tnfr/validation/rules.py +161 -74
  145. tnfr/validation/rules.pyi +55 -18
  146. tnfr/validation/runtime.py +263 -0
  147. tnfr/validation/runtime.pyi +31 -0
  148. tnfr/validation/soft_filters.py +170 -0
  149. tnfr/validation/soft_filters.pyi +37 -0
  150. tnfr/validation/spectral.py +159 -0
  151. tnfr/validation/spectral.pyi +46 -0
  152. tnfr/validation/syntax.py +28 -139
  153. tnfr/validation/syntax.pyi +7 -4
  154. tnfr/validation/window.py +39 -0
  155. tnfr/validation/window.pyi +1 -0
  156. tnfr/viz/__init__.py +9 -0
  157. tnfr/viz/matplotlib.py +246 -0
  158. {tnfr-6.0.0.dist-info → tnfr-7.0.0.dist-info}/METADATA +63 -19
  159. tnfr-7.0.0.dist-info/RECORD +185 -0
  160. {tnfr-6.0.0.dist-info → tnfr-7.0.0.dist-info}/licenses/LICENSE.md +1 -1
  161. tnfr/constants_glyphs.py +0 -16
  162. tnfr/constants_glyphs.pyi +0 -12
  163. tnfr/grammar.py +0 -25
  164. tnfr/grammar.pyi +0 -13
  165. tnfr/helpers/__init__.py +0 -151
  166. tnfr/helpers/__init__.pyi +0 -66
  167. tnfr/helpers/numeric.pyi +0 -12
  168. tnfr/presets.py +0 -15
  169. tnfr/presets.pyi +0 -7
  170. tnfr/utils/io.pyi +0 -10
  171. tnfr/utils/validators.py +0 -130
  172. tnfr/utils/validators.pyi +0 -19
  173. tnfr-6.0.0.dist-info/RECORD +0 -157
  174. {tnfr-6.0.0.dist-info → tnfr-7.0.0.dist-info}/WHEEL +0 -0
  175. {tnfr-6.0.0.dist-info → tnfr-7.0.0.dist-info}/entry_points.txt +0 -0
  176. {tnfr-6.0.0.dist-info → tnfr-7.0.0.dist-info}/top_level.txt +0 -0
tnfr/viz/matplotlib.py ADDED
@@ -0,0 +1,246 @@
1
+ """Matplotlib plots for TNFR telemetry channels."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+ from typing import Iterable, Mapping, MutableMapping, Sequence
7
+
8
+ import numpy as np
9
+ from matplotlib import pyplot as plt
10
+ from matplotlib.axes import Axes
11
+ from matplotlib.figure import Figure
12
+
13
+ PathLike = str | Path
14
+
15
+
16
+ def _normalise_path(save_path: PathLike | None) -> Path | None:
17
+ if save_path is None:
18
+ return None
19
+ return Path(save_path).expanduser().resolve()
20
+
21
+
22
+ def _prepare_metadata(base: Mapping[str, str] | None = None, **entries: float | str) -> MutableMapping[str, str]:
23
+ metadata: MutableMapping[str, str] = {"engine": "TNFR"}
24
+ if base is not None:
25
+ metadata.update(base)
26
+ for key, value in entries.items():
27
+ metadata[key] = str(value)
28
+ return metadata
29
+
30
+
31
+ def plot_coherence_matrix(
32
+ coherence_matrix: np.ndarray,
33
+ *,
34
+ channels: Sequence[str] | None = None,
35
+ save_path: PathLike | None = None,
36
+ dpi: int = 300,
37
+ cmap: str = "viridis",
38
+ ) -> tuple[Figure, Axes]:
39
+ """Plot the coherence matrix :math:`C(t)` describing nodal coupling.
40
+
41
+ Parameters
42
+ ----------
43
+ coherence_matrix:
44
+ Square matrix reporting pairwise TNFR coherence (0-1). Each entry
45
+ encodes how two nodes sustain a mutual resonance while the total coherence
46
+ :math:`C(t)` evolves.
47
+ channels:
48
+ Optional channel names aligned with the matrix axes.
49
+ save_path:
50
+ Optional filesystem location. When provided the figure is exported with
51
+ explicit metadata so structural logs can capture how :math:`C(t)` was
52
+ rendered.
53
+ dpi:
54
+ Resolution of the exported artifact in dots per inch.
55
+ cmap:
56
+ Matplotlib colormap name used for the coherence heatmap.
57
+
58
+ Returns
59
+ -------
60
+ (Figure, Axes)
61
+ The Matplotlib figure and heatmap axis.
62
+ """
63
+
64
+ matrix = np.asarray(coherence_matrix, dtype=float)
65
+ if matrix.ndim != 2 or matrix.shape[0] != matrix.shape[1]:
66
+ raise ValueError("coherence_matrix must be a square 2D array")
67
+
68
+ fig, ax = plt.subplots(figsize=(6, 5))
69
+ image = ax.imshow(matrix, cmap=cmap, vmin=0.0, vmax=1.0)
70
+ ax.set_title("TNFR Coherence Matrix C(t)")
71
+ ax.set_xlabel("Emission nodes (νf order)")
72
+ ax.set_ylabel("Reception nodes (νf order)")
73
+ cbar = fig.colorbar(image, ax=ax, shrink=0.85)
74
+ cbar.set_label("Structural coherence C(t)")
75
+
76
+ size = matrix.shape[0]
77
+ ticks = np.arange(size)
78
+ ax.set_xticks(ticks)
79
+ ax.set_yticks(ticks)
80
+ if channels is not None and len(channels) == size:
81
+ ax.set_xticklabels(channels, rotation=45, ha="right")
82
+ ax.set_yticklabels(channels)
83
+
84
+ mean_coherence = float(matrix.mean())
85
+ metadata = _prepare_metadata(
86
+ {"tnfr_plot": "coherence_matrix"},
87
+ c_t_mean=mean_coherence,
88
+ phase_reference="synchrony-check",
89
+ )
90
+
91
+ resolved_path = _normalise_path(save_path)
92
+ if resolved_path is not None:
93
+ fig.savefig(
94
+ resolved_path,
95
+ dpi=dpi,
96
+ bbox_inches="tight",
97
+ metadata=metadata,
98
+ )
99
+
100
+ return fig, ax
101
+
102
+
103
+ def plot_phase_sync(
104
+ phase_paths: np.ndarray,
105
+ time_axis: np.ndarray,
106
+ *,
107
+ structural_frequency: float,
108
+ node_labels: Sequence[str] | None = None,
109
+ save_path: PathLike | None = None,
110
+ dpi: int = 300,
111
+ ) -> tuple[Figure, Axes]:
112
+ """Plot phase synchrony φ(t) trajectories for TNFR nodes.
113
+
114
+ Parameters
115
+ ----------
116
+ phase_paths:
117
+ Array with shape ``(nodes, samples)`` describing the phase of each node
118
+ in radians. Synchronised paths map how the coupling operator preserves
119
+ phase locking.
120
+ time_axis:
121
+ Monotonic timestamps aligned with the samples describing the evolution of
122
+ :math:`C(t)`.
123
+ structural_frequency:
124
+ Global structural frequency :math:`ν_f` (Hz_str) used as the reference
125
+ rate for the displayed phases.
126
+ node_labels:
127
+ Optional labels describing the emitting nodes. When omitted generic
128
+ indices are used.
129
+ save_path:
130
+ Optional filesystem location to export the figure with TNFR metadata.
131
+ dpi:
132
+ Resolution used for exported figures.
133
+
134
+ Returns
135
+ -------
136
+ (Figure, Axes)
137
+ The Matplotlib figure and axis holding the phase trajectories.
138
+ """
139
+
140
+ phases = np.asarray(phase_paths, dtype=float)
141
+ times = np.asarray(time_axis, dtype=float)
142
+ if phases.ndim != 2:
143
+ raise ValueError("phase_paths must be a 2D array")
144
+ if times.ndim != 1:
145
+ raise ValueError("time_axis must be a 1D array")
146
+ if phases.shape[1] != times.shape[0]:
147
+ raise ValueError("phase_paths samples must align with time_axis")
148
+
149
+ fig, ax = plt.subplots(figsize=(7, 4))
150
+ labels: Iterable[str]
151
+ if node_labels is not None and len(node_labels) == phases.shape[0]:
152
+ labels = node_labels
153
+ else:
154
+ labels = (f"node {idx}" for idx in range(phases.shape[0]))
155
+
156
+ for path, label in zip(phases, labels):
157
+ ax.plot(times, path, label=label)
158
+
159
+ ax.set_title("TNFR Phase Synchrony φ(t)")
160
+ ax.set_xlabel("Time (structural cycles)")
161
+ ax.set_ylabel("Phase (rad)")
162
+ ax.legend(loc="best")
163
+
164
+ metadata = _prepare_metadata(
165
+ {"tnfr_plot": "phase_sync"},
166
+ nu_f_hz_str=structural_frequency,
167
+ phase_span=float(np.ptp(phases)),
168
+ )
169
+
170
+ resolved_path = _normalise_path(save_path)
171
+ if resolved_path is not None:
172
+ fig.savefig(
173
+ resolved_path,
174
+ dpi=dpi,
175
+ bbox_inches="tight",
176
+ metadata=metadata,
177
+ )
178
+
179
+ return fig, ax
180
+
181
+
182
+ def plot_spectrum_path(
183
+ frequencies: np.ndarray,
184
+ spectrum: np.ndarray,
185
+ *,
186
+ label: str = "C(t) spectral density",
187
+ save_path: PathLike | None = None,
188
+ dpi: int = 300,
189
+ ) -> tuple[Figure, Axes]:
190
+ """Plot the spectral path of coherence intensity over structural frequency.
191
+
192
+ Parameters
193
+ ----------
194
+ frequencies:
195
+ Frequency samples (Hz_str) that describe the spectrum of ΔNFR driven
196
+ reorganisations.
197
+ spectrum:
198
+ Intensity values tracking how coherence redistributes along the
199
+ structural frequency axis.
200
+ label:
201
+ Legend label identifying the traced path of :math:`C(t)`.
202
+ save_path:
203
+ Optional filesystem location to persist the figure with TNFR metadata.
204
+ dpi:
205
+ Resolution used for exported figures.
206
+
207
+ Returns
208
+ -------
209
+ (Figure, Axes)
210
+ The Matplotlib figure and axis holding the spectrum path.
211
+ """
212
+
213
+ freq = np.asarray(frequencies, dtype=float)
214
+ spec = np.asarray(spectrum, dtype=float)
215
+ if freq.ndim != 1:
216
+ raise ValueError("frequencies must be a 1D array")
217
+ if spec.ndim != 1:
218
+ raise ValueError("spectrum must be a 1D array")
219
+ if freq.shape[0] != spec.shape[0]:
220
+ raise ValueError("frequencies and spectrum must share the same length")
221
+
222
+ fig, ax = plt.subplots(figsize=(7, 4))
223
+ ax.plot(freq, spec, marker="o", label=label)
224
+ ax.fill_between(freq, spec, alpha=0.2)
225
+ ax.set_title("TNFR Structural Spectrum")
226
+ ax.set_xlabel("Structural frequency ν_f (Hz_str)")
227
+ ax.set_ylabel("Coherence intensity C(t)")
228
+ ax.legend(loc="best")
229
+
230
+ metadata = _prepare_metadata(
231
+ {"tnfr_plot": "spectrum_path"},
232
+ nu_f_min=float(freq.min()),
233
+ nu_f_max=float(freq.max()),
234
+ )
235
+
236
+ resolved_path = _normalise_path(save_path)
237
+ if resolved_path is not None:
238
+ fig.savefig(
239
+ resolved_path,
240
+ dpi=dpi,
241
+ bbox_inches="tight",
242
+ metadata=metadata,
243
+ )
244
+
245
+ return fig, ax
246
+
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tnfr
3
- Version: 6.0.0
3
+ Version: 7.0.0
4
4
  Summary: Modular structural-based dynamics on networks.
5
5
  Author: fmg
6
6
  License: MIT
7
7
  Project-URL: Homepage, https://pypi.org/project/tnfr/
8
8
  Project-URL: Repository, https://github.com/fermga/TNFR-Python-Engine
9
- Project-URL: GPT, https://chatgpt.com/g/g-67abc78885a88191b2d67f94fd60dc97-tnfr-teoria-de-la-naturaleza-fractal-resonante
9
+ Project-URL: GPT, https://chatgpt.com/g/g-67abc78885a88191b2d67f94fd60dc97-tnfr-resonant-fractal-nature-theory
10
10
  Keywords: TNFR,complex systems,fractals,resonance,networks,structural dynamics,structural analysis
11
11
  Classifier: Programming Language :: Python :: 3
12
12
  Classifier: Programming Language :: Python :: 3 :: Only
@@ -28,23 +28,47 @@ Requires-Dist: cachetools>=5
28
28
  Requires-Dist: typing-extensions>=4.4; python_version < "3.10"
29
29
  Provides-Extra: numpy
30
30
  Requires-Dist: numpy>=1.24; extra == "numpy"
31
+ Provides-Extra: jax
32
+ Requires-Dist: jax>=0.4; extra == "jax"
33
+ Provides-Extra: torch
34
+ Requires-Dist: torch>=2.1; extra == "torch"
31
35
  Provides-Extra: yaml
32
36
  Requires-Dist: pyyaml>=6.0; extra == "yaml"
33
37
  Provides-Extra: orjson
34
38
  Requires-Dist: orjson>=3; extra == "orjson"
39
+ Provides-Extra: viz
40
+ Requires-Dist: matplotlib>=3.7; extra == "viz"
41
+ Provides-Extra: docs
42
+ Requires-Dist: sphinx>=7.2; extra == "docs"
43
+ Requires-Dist: sphinx-autodoc-typehints>=1.25; extra == "docs"
44
+ Requires-Dist: myst-parser>=2.0; extra == "docs"
45
+ Requires-Dist: nbsphinx>=0.9; extra == "docs"
46
+ Requires-Dist: sphinx-rtd-theme>=1.3; extra == "docs"
47
+ Requires-Dist: sphinxcontrib-mermaid>=0.9; extra == "docs"
48
+ Requires-Dist: ipykernel>=6; extra == "docs"
49
+ Requires-Dist: nbconvert>=7.16; extra == "docs"
50
+ Requires-Dist: pypandoc-binary>=1.14; extra == "docs"
35
51
  Provides-Extra: test
36
52
  Requires-Dist: pytest>=7; extra == "test"
37
53
  Requires-Dist: pytest-benchmark>=4; extra == "test"
38
54
  Requires-Dist: pydocstyle>=6; extra == "test"
39
55
  Requires-Dist: coverage>=7; extra == "test"
56
+ Requires-Dist: hypothesis>=6; extra == "test"
57
+ Requires-Dist: hypothesis-networkx>=0.3; extra == "test"
40
58
  Requires-Dist: flake8>=5; extra == "test"
41
59
  Requires-Dist: flake8-pyproject>=1.2; extra == "test"
42
60
  Requires-Dist: vulture>=2; extra == "test"
61
+ Requires-Dist: matplotlib>=3.7; extra == "test"
43
62
  Provides-Extra: typecheck
44
63
  Requires-Dist: mypy>=1.8; extra == "typecheck"
45
64
  Requires-Dist: networkx-stubs>=0.0.1; extra == "typecheck"
46
65
  Requires-Dist: types-cachetools>=6.0.0.0; extra == "typecheck"
47
66
  Requires-Dist: numpy>=1.24; extra == "typecheck"
67
+ Provides-Extra: release
68
+ Requires-Dist: python-semantic-release<11,>=10.4; extra == "release"
69
+ Requires-Dist: setuptools-scm<9,>=8; extra == "release"
70
+ Requires-Dist: build>=1; extra == "release"
71
+ Requires-Dist: towncrier>=23; extra == "release"
48
72
  Dynamic: license-file
49
73
 
50
74
  # TNFR Python Engine
@@ -72,31 +96,51 @@ Install from PyPI (Python ≥ 3.9):
72
96
  pip install tnfr
73
97
  ```
74
98
 
75
- Then follow the [quickstart guide](docs/getting-started/quickstart.md) for Python and CLI
99
+ Then follow the [quickstart guide](docs/source/getting-started/quickstart.md) for Python and CLI
76
100
  walkthroughs plus optional dependency caching helpers.
77
101
 
102
+ ## CLI profiling helpers
103
+
104
+ Generate Sense Index and ΔNFR profiling artefacts directly from the CLI with the
105
+ ``profile-pipeline`` subcommand. The helper reproduces the performance benchmark that
106
+ captures vectorised and fallback execution traces for the full pipeline:
107
+
108
+ ```bash
109
+ tnfr profile-pipeline \
110
+ --nodes 120 --edge-probability 0.28 --loops 3 \
111
+ --si-chunk-sizes auto 48 --dnfr-chunk-sizes auto \
112
+ --si-workers auto --dnfr-workers auto \
113
+ --output-dir profiles/pipeline
114
+ ```
115
+
116
+ The command writes ``.pstats`` and JSON summaries for each configuration/mode pair, making
117
+ it easy to inspect hot paths with :mod:`pstats`, Snakeviz, or downstream tooling.
118
+
78
119
  ## Documentation map
79
120
 
80
- - [Documentation index](docs/index.md) — navigation hub for API chapters and examples.
81
- - [API overview](docs/api/overview.md) — package map, invariants, and structural data flow.
82
- - [Structural operators](docs/api/operators.md) — canonical grammar, key concepts, and typical
121
+ - [Documentation index](docs/source/home.md) — navigation hub for API chapters and examples.
122
+ - [API overview](docs/source/api/overview.md) — package map, invariants, and structural data flow.
123
+ - [Structural operators](docs/source/api/operators.md) — canonical grammar, key concepts, and typical
83
124
  workflows.
84
- - [Telemetry & utilities](docs/api/telemetry.md) — coherence metrics, trace capture, locking,
125
+ - [Telemetry & utilities](docs/source/api/telemetry.md) — coherence metrics, trace capture, locking,
85
126
  and helper facades.
86
- - [Examples](docs/examples/README.md) — runnable scenarios, CLI artefacts, and token legend.
127
+ - [Examples](docs/source/examples/README.md) — runnable scenarios, CLI artefacts, and token legend.
87
128
 
88
129
  ## Documentation build workflow
89
130
 
90
- Netlify publishes the documentation with [MkDocs](https://www.mkdocs.org/) so the generated
91
- site preserves the canonical TNFR structure. The same steps can be executed locally:
131
+ Netlify now renders the documentation with [Sphinx](https://www.sphinx-doc.org/) so MyST Markdown,
132
+ doctests, and notebooks share a single pipeline. Reproduce the hosted site locally as follows:
92
133
 
93
134
  1. Create and activate a virtual environment (e.g. `python -m venv .venv && source .venv/bin/activate`).
94
- 2. Install the documentation toolchain: `python -m pip install -r docs/requirements.txt`.
95
- 3. Preview changes live with `mkdocs serve` or reproduce the Netlify pipeline with
96
- `mkdocs build`, which writes the static site to the `site/` directory.
135
+ 2. Install the documentation toolchain and project extras:
136
+ `python -m pip install -r docs/requirements.txt && python -m pip install -e .[docs]`.
137
+ 3. Execute the doctest suite with `sphinx-build -b doctest docs/source docs/_build/doctest` to ensure
138
+ structural snippets remain coherent.
139
+ 4. Generate the HTML site with `make docs`, which wraps `sphinx-build -b html docs/source docs/_build/html`.
97
140
 
98
- The Netlify build (`netlify.toml`) runs `python -m pip install -r docs/requirements.txt && mkdocs build`
99
- and publishes the resulting `site/` directory, ensuring the hosted documentation matches local builds.
141
+ The Netlify build (`netlify.toml`) runs `python -m pip install -r docs/requirements.txt && make docs`
142
+ and publishes the resulting `docs/_build/html` directory, keeping the hosted documentation aligned with
143
+ local verification runs.
100
144
 
101
145
  ## Local development
102
146
 
@@ -122,11 +166,11 @@ integration.
122
166
 
123
167
  ## Migration notes
124
168
 
125
- - **Si dispersion keys:** Replace any remaining ``dSi_ddisp_fase`` entries in graph payloads
126
- or configuration files with the English ``dSi_dphase_disp`` key before upgrading. The
127
- runtime now raises :class:`ValueError` listing any unexpected sensitivity keys, and
169
+ - **Si dispersion keys:** Ensure graph payloads and configuration files use the canonical
170
+ ``dSi_dphase_disp`` attribute for Si dispersion sensitivity before upgrading. The runtime now
171
+ raises :class:`ValueError` listing any unexpected sensitivity keys, and
128
172
  :func:`tnfr.metrics.sense_index.compute_Si_node` rejects unknown keyword arguments.
129
- - Refer to the [release notes](docs/releases.md#1100-si-dispersion-legacy-keys-removed) for
173
+ - Refer to the [release notes](docs/source/releases.md#1100-si-dispersion-legacy-keys-removed) for
130
174
  a migration snippet that rewrites stored graphs in place prior to running the new version.
131
175
 
132
176
  ## Licensing
@@ -0,0 +1,185 @@
1
+ tnfr/__init__.py,sha256=g0tndt07W5xeIaL-w3L7U7T0JdhoRSnFCMtPfTBu-0U,9746
2
+ tnfr/__init__.pyi,sha256=4SA7ziRnj4OzTAyVRIyCKpoV4-artWbrMK6RYJIacCY,971
3
+ tnfr/_compat.py,sha256=7PupclnxZwajAyotcFCZh2pp76XLGkiJB7dkFRX9k4k,413
4
+ tnfr/_generated_version.py,sha256=oi04Nr4CtPS1Olts0VRn20QWRB1Di3CuIu2VzPt8eo4,738
5
+ tnfr/_version.py,sha256=_A6chzLhnOJvI_SDx4BD3nO-2wvVsmeixSljSNgt_fw,1310
6
+ tnfr/_version.pyi,sha256=DbyhsjJTujojo0nxFtOdH94bxGxzReRJNjZoHV-zG1s,95
7
+ tnfr/alias.py,sha256=d7-BSdKrquQL-hAWL5eU-1yCKLD79GKmTNwOg52L2OE,18230
8
+ tnfr/alias.pyi,sha256=ALQ5C-xfecKyMZ8Bdxwf6yCFLm_wF9MdZX9bFEhMCuE,2900
9
+ tnfr/cache.py,sha256=h_35QN6xuYMcS0MV9pvqCM5e8BWLjH2ZU9uzaoUy5u0,400
10
+ tnfr/cache.pyi,sha256=OYLZnlMF5o-u4AeRmIHxIQDHUqiqyIzyAF1hrKg3RMA,381
11
+ tnfr/callback_utils.py,sha256=1WctQu2Nzuw-t0hf1hDDWljb8_cqNSrgi_u2xBV6nco,11994
12
+ tnfr/callback_utils.pyi,sha256=WVAYdQTztVsHbq1CV0XgLcRxhBCkPkjtrlArP_VLFxw,2267
13
+ tnfr/execution.py,sha256=J9haqn0L05kkNaYgxIE8jjsMTRClM1Q9a27JmS3nXKk,6202
14
+ tnfr/execution.pyi,sha256=LmVZ2e8gypyxVvpXvG4DAYZR1hXq8JVCiJYak2zZjzU,1445
15
+ tnfr/flatten.py,sha256=02sS36O25UgRMrMAx_yK18GQsJpc3c16af80WWgBf8A,8375
16
+ tnfr/flatten.pyi,sha256=3jrAnOldsMSBSvuWzrSljNaASyNIhPzybhkuMm-WdIM,575
17
+ tnfr/gamma.py,sha256=SYNGvnWKkcOBcz3rk5CEkPddBz8QMkJgTJlOdgwXmhg,11120
18
+ tnfr/gamma.pyi,sha256=A7ocaSTPVHFmDBFjKIKYK8BCq_NNc7HEcohtps7bp_E,999
19
+ tnfr/glyph_history.py,sha256=jYf6NqvhwEfpD57ex-5aHctE4jfPYVZnjeZmP05BBZ0,12092
20
+ tnfr/glyph_history.pyi,sha256=K_ffAGUVjWqHXkNo81PdOHofQ12nS2Arba6w6htuVWc,1319
21
+ tnfr/glyph_runtime.py,sha256=YqoKKdJz0QCGTAXGzaByN8aFRUsu4Zz88Q4VDlhKsjA,379
22
+ tnfr/glyph_runtime.pyi,sha256=PD7fwH0LuXTj0MfHlKHzGUVd3kBRu0arU7LEzDQSe5E,180
23
+ tnfr/immutable.py,sha256=zacyAYNzqAP9IufwftjJG_gYPbwwOtXXECZY7jXvJds,6533
24
+ tnfr/immutable.pyi,sha256=vyISEfqLumo10HvqhHR8j5DHkT_WWt0GNYE8kck_jzM,1289
25
+ tnfr/initialization.py,sha256=m6nRBu6xcDDrvYs6Q7skqshzUCLZgNwydkM2HbruSF8,5874
26
+ tnfr/initialization.pyi,sha256=M1YahQOiRAZ4CUmNW3Og8wfn67v35VDZVKTmXlP5fk8,1337
27
+ tnfr/io.py,sha256=0kSYGCxZr3hgoB2Ky6Jq_aF0IITLqWJylB7oc7e2jCE,342
28
+ tnfr/io.pyi,sha256=utzqwABymoJTGDZOLplUjGNXs151kXzKvUlyw2FTSDo,372
29
+ tnfr/locking.py,sha256=mOvaENBNSsWw6KiBG_UXv4xXfZ9uQZvWw5SN2cKFmSU,1168
30
+ tnfr/locking.pyi,sha256=GoQ-C3l87O78jCi38VmUDpXwMnocPe0eavJFEN4QdXU,92
31
+ tnfr/node.py,sha256=QAHZrIt3KpjyfqdAULL9EoH5mUDwh64t-RBrK3oIkbc,22855
32
+ tnfr/node.pyi,sha256=GUHqvYKZw98wNcIxz9s-pTYcMANujFdMRcp_MMGseKo,5437
33
+ tnfr/observers.py,sha256=rd4GiMtuPgp1IYF4KAMKam1VZnz8uoNb-ZMSXmKWHMY,8511
34
+ tnfr/observers.pyi,sha256=W_FlbmgUca-EUUs1D29vUnpC1QJf-e3FvXgSwSU2GOc,866
35
+ tnfr/ontosim.py,sha256=4_rAcZlh1hMMLoHx9nao2kNr1dWKVXMbQQ7K_T3U6AM,4171
36
+ tnfr/ontosim.pyi,sha256=jwmBdpQFBuYvlm_aVcIY2RH9oV2o7jVhLxPhdR2glmQ,560
37
+ tnfr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ tnfr/rng.py,sha256=xtx9S6TFe63SM8nfut4-LrP_nQoZWOljJlD2vegqo3I,4544
39
+ tnfr/rng.pyi,sha256=95PakrXx9OYVrEUIrwR9xxuuGxiYK1ZZXWNm0cLf1AA,232
40
+ tnfr/selector.py,sha256=BTBr4t1wldGtkemvQmhd7V4NvYirsl014L-LlBGi5Cw,6153
41
+ tnfr/selector.pyi,sha256=9Z3ngo-8QYc8iR68uSSu6hsPa5A-JMGRyV5xVWtJqwA,379
42
+ tnfr/sense.py,sha256=ur6BIpsOp4EdyvCR7C-0HDcwYkJX6momfCDfx2Xoa7g,10334
43
+ tnfr/sense.pyi,sha256=mrfLRYVvIB4LSEC4Ev6PeD_T3W12Lc39q_9T2lTB2uo,787
44
+ tnfr/structural.py,sha256=qmvY3TRySMlajrljbfqjK91SKpub7MSW5ba9j6caDJw,19850
45
+ tnfr/structural.pyi,sha256=uGYuFYcI9tZA2ohPIs_rBp-g8qtBx3KCRiECmtwFUCQ,1938
46
+ tnfr/tokens.py,sha256=skXPGgPlJAYmU7Z6WHfR00JB_QZS8SHmOPLfew9BvCY,1118
47
+ tnfr/tokens.pyi,sha256=qLLQAOeH3AlLsIocaXo18ralZk-s6vWKwQi6RooZsjY,678
48
+ tnfr/trace.py,sha256=QlQGM6lkKC6K89KavGZyZK7mWQryVunT5urcixwNKU4,14532
49
+ tnfr/trace.pyi,sha256=VpQDQ3RIKaHHuyql1LKmblxOhzN5NmfreiOgXxE6LSw,1429
50
+ tnfr/types.py,sha256=H3_rNQcY3sBEjB6naLLPcYu0jfC5v6MYj1ud3eSQllo,18011
51
+ tnfr/types.pyi,sha256=FiLXVAtPNm5oeImNP06CYZ4KrzHWDqo4oamKZO3zTOg,8827
52
+ tnfr/units.py,sha256=887IFMh2wdHl42iEXrb7eSVQdrBAwgXqZonv89l35co,2310
53
+ tnfr/units.pyi,sha256=HrHqqxy0ZMbSOjMovOjRhAV_U7Wih2qbPnlzbGZ-N6c,351
54
+ tnfr/cli/__init__.py,sha256=U4u6TUt9OzH5ZSojHfQMSz_B8k2DBg2FcFxEhfW1ssQ,2355
55
+ tnfr/cli/__init__.pyi,sha256=RnhSe9V3f2jaynl1xO5yEsA-CbDwv41Jg89jp0uj9CM,1019
56
+ tnfr/cli/arguments.py,sha256=FVHGfjnyQJWxMMG7BTExiFKkcQZrVfpKUmkDkY5PiTw,11690
57
+ tnfr/cli/arguments.pyi,sha256=MH8-R6Hzg_QQ6A-v6tvDnsuV5s2zqp-i_fzzkLIzai0,1176
58
+ tnfr/cli/execution.py,sha256=CTg1UcA1O-TUnduYs4xO0hF0B3_XDf0B4Gd5arbUtzg,24191
59
+ tnfr/cli/execution.pyi,sha256=PIguWfAqfkBSEKlSX0bTLf3Ly5tTNCjxWeYA4HSqBMk,2262
60
+ tnfr/cli/utils.py,sha256=G80SaDb4WxOzl0SvpBUoicmCLrvp3X9TgM-9cNkmgT4,1532
61
+ tnfr/cli/utils.pyi,sha256=GS-5SS8-O5dx6jQv-VQPEzj7sewn9TP3ribqrCZFC04,249
62
+ tnfr/config/__init__.py,sha256=N7_ZoNWwOF8Nwh62ZcBAMI20uKyfWXmw71kttTtsjJI,466
63
+ tnfr/config/__init__.pyi,sha256=VFItND2d_MkIBCGT5OX-cBYw_hf3OeukjrtVGXZ2OzE,147
64
+ tnfr/config/constants.py,sha256=8d_nXHpuM7DBKMeKonT0Wwft-oZgKxljYdhhZOOzceg,2830
65
+ tnfr/config/constants.pyi,sha256=Xtm8NhTukF_rpn4Y7hy9O7aT1IcWSuQLcDpFcUnZnbk,192
66
+ tnfr/config/feature_flags.py,sha256=QX69qeFfBGG_JNnsXauKD0Do874kMBK1M7-EfeK9epY,2358
67
+ tnfr/config/init.py,sha256=RsdjDJPJSYMaqYTNi3WpCGpPq2MIswGp8xvw1J0nv9k,1032
68
+ tnfr/config/init.pyi,sha256=m1D1GQIyCbwnllwXNoPriPkxzBYIJUZBik-jJXdW_CA,113
69
+ tnfr/config/operator_names.py,sha256=fuSyRZyAvryD5MfbKeXuuDIwGlT_ytgzsmwgjS1wMfQ,2246
70
+ tnfr/config/operator_names.pyi,sha256=9GgUMxZXzoemlnIjkTmtruOJ2DkA__DfjQTeouRNVu4,532
71
+ tnfr/config/presets.py,sha256=5Tw_1fFVKTk9wVUKQfgbNEmNB1K57mJIrEMTu2K0UZU,1972
72
+ tnfr/config/presets.pyi,sha256=8oHCzjv8AOcfWWRZb4pgTJ40HJUXbbrDOyQoSb_XsD8,94
73
+ tnfr/constants/__init__.py,sha256=CndtGAB7afsxcTIcQmvAAkq22nRIVGNMzuqw91Ghp2Q,6442
74
+ tnfr/constants/__init__.pyi,sha256=uwxQfz1qsFJdJI_bRw_d6jL-NO_QdiLdbZoAJJMFq1Q,2357
75
+ tnfr/constants/aliases.py,sha256=12ctTPZPGjKqnmPWy7DldF9N_D7oNJufXWuoooqGBf0,687
76
+ tnfr/constants/core.py,sha256=D2KfrJUs2ba6B7egT1rhPBxoCmiw_0wgcLUXpc8D--w,4749
77
+ tnfr/constants/core.pyi,sha256=H9oY3Skdse9qPSFw2gF7mpyAUzFCPwo3RaYIVnxDfvo,279
78
+ tnfr/constants/init.py,sha256=f9EEXtcTCoc6MDdIEqnTI3OVAqEQ034_D6D467OAhaY,805
79
+ tnfr/constants/init.pyi,sha256=jdf_jVgcRlVxzFzioOw_ANXUbtAc-0iHfLLAT1tLyaw,169
80
+ tnfr/constants/metric.py,sha256=Lu8-w_XC_bsDdK-7qLPJzQb2CJ88KOjM7TuDCMFZWe0,3290
81
+ tnfr/constants/metric.pyi,sha256=x0U5uD9fzgmSUz_EoUdBE2zrEdbgnaMgbMxUFyA7vB8,280
82
+ tnfr/dynamics/__init__.py,sha256=KJdXqNzhdObN1WMHOpt4VxIGDI1e7d6RW3eqHxd8P90,6034
83
+ tnfr/dynamics/__init__.pyi,sha256=sC9HqZFnXp2wn8fRZDKo2wRIOuzo1qwgOwDjzWvUQ2g,1934
84
+ tnfr/dynamics/adaptation.py,sha256=RKLEPd9CQ3NgvN7Sg1jUkYrU4EHOEACe2yysA5k3SF8,9973
85
+ tnfr/dynamics/aliases.py,sha256=JGceP4H9E-MwfHd5jSxhTRwN5N5cghTbot4W7LB0Fbc,382
86
+ tnfr/dynamics/coordination.py,sha256=vWU4tBJPARCyhMSzG0A2-iNa5HtcpzlOtLr_UULWnpw,13099
87
+ tnfr/dynamics/dnfr.py,sha256=PyrkkH2Eb8uujL7e6SLHia4EAxYVbfcFS4ZTT3-RGi8,87752
88
+ tnfr/dynamics/dnfr.pyi,sha256=WI1CdUS3qFXHtkpBim6Y52VgvQRuh6QJ74eEM7D_a_c,697
89
+ tnfr/dynamics/integrators.py,sha256=DKxcGcUn7KBtxjC8lcXqGHvMLd5kfrNdXUK4qAE10Bc,17234
90
+ tnfr/dynamics/integrators.pyi,sha256=HNwYSc9MUmY6ufIwFdV-6bHeOaP0r9G3_MAfUrNajkE,842
91
+ tnfr/dynamics/runtime.py,sha256=NyhbWed-ZcZB8G35GU7KW2k8vu9Yjl5ppmqCyorvQ2U,29376
92
+ tnfr/dynamics/sampling.py,sha256=6ZdO4S-gyYRIdpzjYITkratQ6XtKiC3SnEq9hANgxNY,1320
93
+ tnfr/dynamics/sampling.pyi,sha256=edfyDqgtvmK4w6zlBNG9nmGpZDVe3pdnNZYOLFbwIG8,102
94
+ tnfr/dynamics/selectors.py,sha256=s-hOTaWRc4DosBrt7cIRZAEE8iacoxU9FlPi7ZZRM7U,23951
95
+ tnfr/mathematics/__init__.py,sha256=KH7MsxRw9cYxBOvu_K7sCiA2bUkrYOY5UJZEX6Y2_Tw,2373
96
+ tnfr/mathematics/backend.py,sha256=ZIPbPwm8ckH2hpJ6Q7K6ZxzSL3L0h3qMJwx34TitAyM,14122
97
+ tnfr/mathematics/dynamics.py,sha256=DkrmZ6H7h1hFlNNldaAiLGUOF1tlzN1t8P4QbXY-t9A,16228
98
+ tnfr/mathematics/epi.py,sha256=R6RufmxCk93MxwHCuSOg70L9eY5gN5f-hVv4UbS8sPo,9191
99
+ tnfr/mathematics/generators.py,sha256=BeA_5kW-peFO23VtoIUq7siABG3Q6YT3Q_NyXR2ex6Y,8046
100
+ tnfr/mathematics/metrics.py,sha256=erhgK9SC__FqekHTjadx8uZXacDCJwYpO5nVViAAzEU,4258
101
+ tnfr/mathematics/operators.py,sha256=VT4_pUALZ9OG6YZQbE5msO8d2ObA8CswMP8ZSQmjYBY,9386
102
+ tnfr/mathematics/operators_factory.py,sha256=3xXVENLB1_DwShJj6nLx2I4mFySBi2u3HroOmkoeaaE,2962
103
+ tnfr/mathematics/projection.py,sha256=C9FXtW49_Ayk0tozzL8DyaWOFrgCHurF_k0UsEvGA44,2812
104
+ tnfr/mathematics/runtime.py,sha256=LXYycn07Z9TcXGB8_wmUFBJPz_Rf3yzb0pLSAWeBJas,5670
105
+ tnfr/mathematics/spaces.py,sha256=lRwYu6Ha10SN9x80ci7xCI219yq1O0lbER4PM01lyeI,9347
106
+ tnfr/mathematics/transforms.py,sha256=6Z_0R2_w8G8YN8mFf9wmA2zYiYENOZ1oj6phloW_D4M,10199
107
+ tnfr/metrics/__init__.py,sha256=3bj0pB8SlPldEUUW6Y5zgTjC4cfi4127xh0P4veX2pY,885
108
+ tnfr/metrics/__init__.pyi,sha256=W5fUkKR9FeEcdHg4OVW2JPzxIRlQ71qtiYqoaEoAM3w,412
109
+ tnfr/metrics/coherence.py,sha256=et_O-PAM4x-79vXScHHw8AYB_9m3AwLlAMyo1INGJ7A,46992
110
+ tnfr/metrics/common.py,sha256=wuW5MH_opoaQn0tjo5zahPB5oz-UWaBIOM3GuZKmH5w,4689
111
+ tnfr/metrics/common.pyi,sha256=jE7Tc6zaOfQF2e1cT-CodYivFrD-evDdi3rEs_XKFG0,1222
112
+ tnfr/metrics/core.py,sha256=EPZ5lKMHp7eFDFh21yCjzaLJ_liYu16-Zr31gYDgdaE,9155
113
+ tnfr/metrics/core.pyi,sha256=8s1j3oeTyzU5xyUIsuP_Q5DkXY6hja_j2xL7ghKcu-U,218
114
+ tnfr/metrics/diagnosis.py,sha256=P_YZ9mjLL-ZJqrxphZmC8qsC11u_qov1fckaVdec_44,26504
115
+ tnfr/metrics/diagnosis.pyi,sha256=9YAsNOWcK-hGyxGmI_gI_gXADom-RQdDX73c41SCXSk,2134
116
+ tnfr/metrics/export.py,sha256=POtu_V9bdHGcKSzPoorykbLgk4dkzp1MBXPBTNvtOY4,4694
117
+ tnfr/metrics/glyph_timing.py,sha256=UikqlPcLkO_EKJxwWfTalWv9tOkXtitlZkM9sOcvs2k,10851
118
+ tnfr/metrics/reporting.py,sha256=qSoDNdD1oClNYftSKTxipBlYmls3MhUPaSTxFUtR-yo,4274
119
+ tnfr/metrics/reporting.pyi,sha256=uA7DP9bM7351dcq4qBooZDXJUSLXyWR3AE2_r9H29YI,194
120
+ tnfr/metrics/sense_index.py,sha256=B3XhPe5lhCFHuoSe46cjFqDiSa4dhpUqUBnQ86ils24,36354
121
+ tnfr/metrics/sense_index.pyi,sha256=YK5rIvhGGN6KyZHVIirCrgBF3eDeJ2zPyfa7x19sqXM,135
122
+ tnfr/metrics/trig.py,sha256=FM7EJIyhT0ShyNVFl5L-fiSFgJOe99Ll4HYXR6Bmock,12156
123
+ tnfr/metrics/trig.pyi,sha256=JKz4nzAWteWmGNDn5TagjBn9DeVu2pxc2ytlISAdzYw,279
124
+ tnfr/metrics/trig_cache.py,sha256=SLo-OUm4yoqN4tF1VixdZsnc5u2xxW_YOUl9I5XZclw,5865
125
+ tnfr/metrics/trig_cache.pyi,sha256=wqxVFp27iiUBB9Uep8rEIU_MIh1PjtsaK_d2RpLGnfE,163
126
+ tnfr/operators/__init__.py,sha256=XfrH9aE82Wg9pR-gMlJ8FmjJvdjYt3G2FW1s53KJVR4,28613
127
+ tnfr/operators/__init__.pyi,sha256=g86OY-VMhXalRn7sBpAHS5tJh65gwMgJv7W57Yl73A0,944
128
+ tnfr/operators/definitions.py,sha256=g6cy9KiditCBa8I97rISseevG-urRFddBhTXm9p31dY,16785
129
+ tnfr/operators/definitions.pyi,sha256=2mim24UxHkQKNggYrwpnDcVPLIIK1vHhGrsVWFH68EQ,1514
130
+ tnfr/operators/grammar.py,sha256=YsUEZpT6TRNPJNeyXj4QGuxHALnExzR0h6u3atLA6jg,26757
131
+ tnfr/operators/jitter.py,sha256=K-q9e0P73PjAgk8iwuPXknn2aZfpyRvC0RcpreHGqvw,8167
132
+ tnfr/operators/jitter.pyi,sha256=FSrSKP51D5N7AdekOH9H-sVzBBaqnnmM2IQKfWlnQN0,188
133
+ tnfr/operators/registry.py,sha256=ZBz0jPgxI_6RMll9FwBfqtbPph2bXdfKCVyi6KY7i3M,2122
134
+ tnfr/operators/registry.pyi,sha256=vFyzTsD8tmSXqbnbRtpxj4PeWXEFel8xAhRX9BozMus,312
135
+ tnfr/operators/remesh.py,sha256=04ExxzOich0AjVknEQnrsUxmTIRgBoU1j4rLydiCAxc,17856
136
+ tnfr/schemas/__init__.py,sha256=nNpFcFInEaTchm2leO5sZN2qgQb1o26IhVZhtl1r4cI,208
137
+ tnfr/schemas/grammar.json,sha256=0Y3Cy5wbqKFMFW5rph4SVXYmTRXmI1eutFTNjk1V5NE,3387
138
+ tnfr/telemetry/__init__.py,sha256=mLRry0sOSRAJAaOlUiTvFO9qw-0GX_0_4wpB0zroMkY,829
139
+ tnfr/telemetry/cache_metrics.py,sha256=CjU6cyjtx0fVQtH62wyZn95Z4P_BkFjyeK23MSi_BmM,7149
140
+ tnfr/telemetry/nu_f.py,sha256=oz_UGw8TUWg4GF-TRJVz6bkW38g_itDs7l74rNiQ0GI,15299
141
+ tnfr/telemetry/nu_f.pyi,sha256=jLmXk3bYweBsciJxJYWGrWdCIObJvbX69rUmi6F8UPA,2870
142
+ tnfr/telemetry/verbosity.py,sha256=6fN7IMhwtLKVQbch-PIN_vLxn3dw178SownD8-xlhKM,1048
143
+ tnfr/utils/__init__.py,sha256=T_I0tTwnOq3RA2GX_MaxdA1mU8ybGqgO4fh3lSRrZ-8,5624
144
+ tnfr/utils/__init__.pyi,sha256=IIf3erf06rG0CPNIj21tJSaVEQpCDesri3hVOAPbsxI,4531
145
+ tnfr/utils/cache.py,sha256=yr49YwwGVdke8ZjihDp9Oe60b9rq-WEBC8kL0HgnG74,79002
146
+ tnfr/utils/cache.pyi,sha256=HijU1vLF3GCOGVkMXwvDix7AIBkBZ_Q5aU89BD8Fsqo,14252
147
+ tnfr/utils/chunks.py,sha256=P3U505eSVvT1KxuBvxLOHunbAHWSowq8eFUQ9VBN5bg,3106
148
+ tnfr/utils/chunks.pyi,sha256=Nna73t4Yz-iF83B_ar9U6Aqfa5GgkZbk418inmQwn_o,456
149
+ tnfr/utils/data.py,sha256=hfP-AizJNrLqnmnARhe628hYug7zA1lmgCVjVYVQF5g,10666
150
+ tnfr/utils/data.pyi,sha256=m04CQOgf8XTCWsKmkSyrmtWBnz-vYeuRFoZyiGhivuw,1792
151
+ tnfr/utils/graph.py,sha256=lku_uqCJAs70eVKBBgr_v7-CR9IPHwbiAbt3PYqCBCs,2775
152
+ tnfr/utils/graph.pyi,sha256=mrMVWDkJQhu8K3l2eUvOSgKCWlWij7e8pANzJjOFXKA,165
153
+ tnfr/utils/init.py,sha256=OEkTfVvpj2ukTIDTQA8GHkfSy4rHGGQnSgalgT-gmA0,23055
154
+ tnfr/utils/init.pyi,sha256=R9d4WoMQi-GYJ8G8G-80EvC6ydNa0MgCJ0VIvu9Rnus,2451
155
+ tnfr/utils/io.py,sha256=Z8EObJWyq78d7SOKC8YTE90QsVHv5aeztVFlbDekhEw,12586
156
+ tnfr/utils/numeric.py,sha256=CsgM7bO5OmX_fLTpQK6BcCCfR3-3DLy-uqILtFbdz58,3429
157
+ tnfr/utils/numeric.pyi,sha256=x_gJtaH3RWpeZ4uJ6x-ndoHbu0PryzA9POFMruYoAD8,696
158
+ tnfr/validation/__init__.py,sha256=2ZbO20Z-vn-abE6wetBDT0VVSMJDBfjp9GEA9ZjbRwM,3240
159
+ tnfr/validation/__init__.pyi,sha256=MwSNIFFeIsgwpnLxLb30e0TCsP5o71cHMSmxO7K17j0,2222
160
+ tnfr/validation/compatibility.py,sha256=UU5k574OY8XugzAfry3TfsX9tF3HkIiHdXwDZwZvr8w,2962
161
+ tnfr/validation/compatibility.pyi,sha256=ES8DxtzNhXuQq4U5mvH1FxfklfWw7i6SmGS3l6pFPQg,146
162
+ tnfr/validation/grammar.py,sha256=0VA6a531zim7NsGPLDKEJFUNPXnWBCwKRCCx3BSuOBs,2046
163
+ tnfr/validation/grammar.pyi,sha256=BGgDxrWKLlQNf7fi53ZKqyecacv_8CDWDva07XbXRZk,985
164
+ tnfr/validation/graph.py,sha256=4WnlA5riCzQScNrz3jvFrGlk4vsIUfKejPHHIibUDvA,4124
165
+ tnfr/validation/graph.pyi,sha256=9rsD0xTYLa6atEjH37x8CGlY2okLLxHIy8kldlMei58,338
166
+ tnfr/validation/rules.py,sha256=zkBC0UOdp88GW4tqfoWcPZgegXlUnLIBokRRgfD5fjU,9521
167
+ tnfr/validation/rules.pyi,sha256=-DAx6YflM42pePlFn7iqOwjGHrm5Cpi6Zt6LEeZNU_g,1178
168
+ tnfr/validation/runtime.py,sha256=jiQNXbOFf5SgM0Ghx159-Kd4UvhdrsnHMOxYwNCXxB0,9105
169
+ tnfr/validation/runtime.pyi,sha256=X1a4Shv3vdKWcbRvklkZjje-U_biLFDgdpTR93hFMpE,771
170
+ tnfr/validation/soft_filters.py,sha256=d2yIPRvqB9giwNtp-G82nl0nxu2ec4U1T2QWbgV7xxc,6271
171
+ tnfr/validation/soft_filters.pyi,sha256=vKvbwWP2IagwtKe-D1wxdU7td39-Z83SJKkLrtxgQT4,790
172
+ tnfr/validation/spectral.py,sha256=Y-mVw0wT9Gokktl5j9tucE2hz20PwUe8D7WB8n5Bc4U,5577
173
+ tnfr/validation/spectral.pyi,sha256=lnJqBU1qtcCBfX9Kb5DfhD6Cscce5SEF6ul0hG4-zAM,1245
174
+ tnfr/validation/syntax.py,sha256=cZQvTpPvozREVXwnp_G6-MhZp-uyrYoYJRje-0J4A6A,1162
175
+ tnfr/validation/syntax.pyi,sha256=gQLbxh6pp3aK-IRA5xT4xyYFakUDE0sHLlB22n8VoPI,232
176
+ tnfr/validation/window.py,sha256=gm7RwLKZyfDmrmOc1YKKHXxT5ilemXIC49dzovC8Xo8,1097
177
+ tnfr/validation/window.pyi,sha256=MlosmgIkkU84txJMBY4MSy_ViHKbEIBD8ByLt8raw_4,70
178
+ tnfr/viz/__init__.py,sha256=3idKMijc6p7NOei4C_rAG5h0Q0ynhgm8xIKFBCfh_c0,225
179
+ tnfr/viz/matplotlib.py,sha256=Dai_Ph-ynUOGzh4PK0MmWbzfsvrh6kVXMXOqEDcJ1vI,7573
180
+ tnfr-7.0.0.dist-info/licenses/LICENSE.md,sha256=6BKHHglVeVbAo6ngKQRGXr7IFGgEJbsTpH4axGQLJ6o,1098
181
+ tnfr-7.0.0.dist-info/METADATA,sha256=Kg4RMH0EHsNYQfCyBUkrB63zqiA7ke_aKhjl4ktmbRc,8218
182
+ tnfr-7.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
183
+ tnfr-7.0.0.dist-info/entry_points.txt,sha256=j4-QRHqeT2WnchHe_mvK7npGTLjlyfLpvRONFe9Z4MU,39
184
+ tnfr-7.0.0.dist-info/top_level.txt,sha256=Q2HJnvc5Rt2VHwVvyBTnNPT4SfmJWnCj7XUxxEvQa7c,5
185
+ tnfr-7.0.0.dist-info/RECORD,,
@@ -1,6 +1,6 @@
1
1
  # MIT License
2
2
 
3
- Copyright (c) 2025 TNFR - Teoría de la naturaleza fractral resonante
3
+ Copyright (c) 2025 TNFR Resonant Fractal Nature Theory
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
tnfr/constants_glyphs.py DELETED
@@ -1,16 +0,0 @@
1
- """Backward compatibility shim for glyph constants."""
2
-
3
- from __future__ import annotations
4
-
5
- import warnings
6
-
7
- from .config.constants import * # noqa: F401,F403 - re-export legacy API
8
- from .config.constants import __all__ as _CONFIG_ALL
9
-
10
- warnings.warn(
11
- "'tnfr.constants_glyphs' is deprecated; use 'tnfr.config.constants' instead",
12
- DeprecationWarning,
13
- stacklevel=2,
14
- )
15
-
16
- __all__ = _CONFIG_ALL
tnfr/constants_glyphs.pyi DELETED
@@ -1,12 +0,0 @@
1
- from typing import Any
2
-
3
- __all__: Any
4
-
5
- def __getattr__(name: str) -> Any: ...
6
-
7
- ANGLE_MAP: Any
8
- DISRUPTORS: Any
9
- STABILIZERS: Any
10
- GLYPHS_CANONICAL: Any
11
- GLYPHS_CANONICAL_SET: Any
12
- GLYPH_GROUPS: Any
tnfr/grammar.py DELETED
@@ -1,25 +0,0 @@
1
- """Backwards compatibility layer for grammar helpers.
2
-
3
- The canonical implementations now live in :mod:`tnfr.validation`. This
4
- module only re-exports them to avoid breaking external callers until the
5
- new import paths are fully adopted.
6
- """
7
-
8
- from .validation.compatibility import CANON_COMPAT, CANON_FALLBACK
9
- from .validation.grammar import (
10
- GrammarContext,
11
- apply_glyph_with_grammar,
12
- enforce_canonical_grammar,
13
- on_applied_glyph,
14
- _gram_state,
15
- )
16
-
17
- __all__ = [
18
- "GrammarContext",
19
- "CANON_COMPAT",
20
- "CANON_FALLBACK",
21
- "enforce_canonical_grammar",
22
- "on_applied_glyph",
23
- "apply_glyph_with_grammar",
24
- "_gram_state",
25
- ]
tnfr/grammar.pyi DELETED
@@ -1,13 +0,0 @@
1
- from typing import Any
2
-
3
- __all__: Any
4
-
5
- def __getattr__(name: str) -> Any: ...
6
-
7
- CANON_COMPAT: Any
8
- CANON_FALLBACK: Any
9
- GrammarContext: Any
10
- _gram_state: Any
11
- apply_glyph_with_grammar: Any
12
- enforce_canonical_grammar: Any
13
- on_applied_glyph: Any