tnfr 4.5.2__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 (195) hide show
  1. tnfr/__init__.py +275 -51
  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 +117 -31
  8. tnfr/alias.pyi +108 -0
  9. tnfr/cache.py +6 -572
  10. tnfr/cache.pyi +16 -0
  11. tnfr/callback_utils.py +16 -38
  12. tnfr/callback_utils.pyi +79 -0
  13. tnfr/cli/__init__.py +34 -14
  14. tnfr/cli/__init__.pyi +26 -0
  15. tnfr/cli/arguments.py +211 -28
  16. tnfr/cli/arguments.pyi +27 -0
  17. tnfr/cli/execution.py +470 -50
  18. tnfr/cli/execution.pyi +70 -0
  19. tnfr/cli/utils.py +18 -3
  20. tnfr/cli/utils.pyi +8 -0
  21. tnfr/config/__init__.py +13 -0
  22. tnfr/config/__init__.pyi +10 -0
  23. tnfr/{constants_glyphs.py → config/constants.py} +26 -20
  24. tnfr/config/constants.pyi +12 -0
  25. tnfr/config/feature_flags.py +83 -0
  26. tnfr/{config.py → config/init.py} +11 -7
  27. tnfr/config/init.pyi +8 -0
  28. tnfr/config/operator_names.py +93 -0
  29. tnfr/config/operator_names.pyi +28 -0
  30. tnfr/config/presets.py +84 -0
  31. tnfr/config/presets.pyi +7 -0
  32. tnfr/constants/__init__.py +80 -29
  33. tnfr/constants/__init__.pyi +92 -0
  34. tnfr/constants/aliases.py +31 -0
  35. tnfr/constants/core.py +4 -4
  36. tnfr/constants/core.pyi +17 -0
  37. tnfr/constants/init.py +1 -1
  38. tnfr/constants/init.pyi +12 -0
  39. tnfr/constants/metric.py +7 -15
  40. tnfr/constants/metric.pyi +19 -0
  41. tnfr/dynamics/__init__.py +165 -633
  42. tnfr/dynamics/__init__.pyi +82 -0
  43. tnfr/dynamics/adaptation.py +267 -0
  44. tnfr/dynamics/aliases.py +23 -0
  45. tnfr/dynamics/coordination.py +385 -0
  46. tnfr/dynamics/dnfr.py +2283 -400
  47. tnfr/dynamics/dnfr.pyi +24 -0
  48. tnfr/dynamics/integrators.py +406 -98
  49. tnfr/dynamics/integrators.pyi +34 -0
  50. tnfr/dynamics/runtime.py +881 -0
  51. tnfr/dynamics/sampling.py +10 -5
  52. tnfr/dynamics/sampling.pyi +7 -0
  53. tnfr/dynamics/selectors.py +719 -0
  54. tnfr/execution.py +70 -48
  55. tnfr/execution.pyi +45 -0
  56. tnfr/flatten.py +13 -9
  57. tnfr/flatten.pyi +21 -0
  58. tnfr/gamma.py +66 -53
  59. tnfr/gamma.pyi +34 -0
  60. tnfr/glyph_history.py +110 -52
  61. tnfr/glyph_history.pyi +35 -0
  62. tnfr/glyph_runtime.py +16 -0
  63. tnfr/glyph_runtime.pyi +9 -0
  64. tnfr/immutable.py +69 -28
  65. tnfr/immutable.pyi +34 -0
  66. tnfr/initialization.py +16 -16
  67. tnfr/initialization.pyi +65 -0
  68. tnfr/io.py +6 -240
  69. tnfr/io.pyi +16 -0
  70. tnfr/locking.pyi +7 -0
  71. tnfr/mathematics/__init__.py +81 -0
  72. tnfr/mathematics/backend.py +426 -0
  73. tnfr/mathematics/dynamics.py +398 -0
  74. tnfr/mathematics/epi.py +254 -0
  75. tnfr/mathematics/generators.py +222 -0
  76. tnfr/mathematics/metrics.py +119 -0
  77. tnfr/mathematics/operators.py +233 -0
  78. tnfr/mathematics/operators_factory.py +71 -0
  79. tnfr/mathematics/projection.py +78 -0
  80. tnfr/mathematics/runtime.py +173 -0
  81. tnfr/mathematics/spaces.py +247 -0
  82. tnfr/mathematics/transforms.py +292 -0
  83. tnfr/metrics/__init__.py +10 -10
  84. tnfr/metrics/__init__.pyi +20 -0
  85. tnfr/metrics/coherence.py +993 -324
  86. tnfr/metrics/common.py +23 -16
  87. tnfr/metrics/common.pyi +46 -0
  88. tnfr/metrics/core.py +251 -35
  89. tnfr/metrics/core.pyi +13 -0
  90. tnfr/metrics/diagnosis.py +708 -111
  91. tnfr/metrics/diagnosis.pyi +85 -0
  92. tnfr/metrics/export.py +27 -15
  93. tnfr/metrics/glyph_timing.py +232 -42
  94. tnfr/metrics/reporting.py +33 -22
  95. tnfr/metrics/reporting.pyi +12 -0
  96. tnfr/metrics/sense_index.py +987 -43
  97. tnfr/metrics/sense_index.pyi +9 -0
  98. tnfr/metrics/trig.py +214 -23
  99. tnfr/metrics/trig.pyi +13 -0
  100. tnfr/metrics/trig_cache.py +115 -22
  101. tnfr/metrics/trig_cache.pyi +10 -0
  102. tnfr/node.py +542 -136
  103. tnfr/node.pyi +178 -0
  104. tnfr/observers.py +152 -35
  105. tnfr/observers.pyi +31 -0
  106. tnfr/ontosim.py +23 -19
  107. tnfr/ontosim.pyi +28 -0
  108. tnfr/operators/__init__.py +601 -82
  109. tnfr/operators/__init__.pyi +45 -0
  110. tnfr/operators/definitions.py +513 -0
  111. tnfr/operators/definitions.pyi +78 -0
  112. tnfr/operators/grammar.py +760 -0
  113. tnfr/operators/jitter.py +107 -38
  114. tnfr/operators/jitter.pyi +11 -0
  115. tnfr/operators/registry.py +75 -0
  116. tnfr/operators/registry.pyi +13 -0
  117. tnfr/operators/remesh.py +149 -88
  118. tnfr/py.typed +0 -0
  119. tnfr/rng.py +46 -143
  120. tnfr/rng.pyi +14 -0
  121. tnfr/schemas/__init__.py +8 -0
  122. tnfr/schemas/grammar.json +94 -0
  123. tnfr/selector.py +25 -19
  124. tnfr/selector.pyi +19 -0
  125. tnfr/sense.py +72 -62
  126. tnfr/sense.pyi +23 -0
  127. tnfr/structural.py +522 -262
  128. tnfr/structural.pyi +69 -0
  129. tnfr/telemetry/__init__.py +35 -0
  130. tnfr/telemetry/cache_metrics.py +226 -0
  131. tnfr/telemetry/nu_f.py +423 -0
  132. tnfr/telemetry/nu_f.pyi +123 -0
  133. tnfr/telemetry/verbosity.py +37 -0
  134. tnfr/tokens.py +1 -3
  135. tnfr/tokens.pyi +36 -0
  136. tnfr/trace.py +270 -113
  137. tnfr/trace.pyi +40 -0
  138. tnfr/types.py +574 -6
  139. tnfr/types.pyi +331 -0
  140. tnfr/units.py +69 -0
  141. tnfr/units.pyi +16 -0
  142. tnfr/utils/__init__.py +217 -0
  143. tnfr/utils/__init__.pyi +202 -0
  144. tnfr/utils/cache.py +2395 -0
  145. tnfr/utils/cache.pyi +468 -0
  146. tnfr/utils/chunks.py +104 -0
  147. tnfr/utils/chunks.pyi +21 -0
  148. tnfr/{collections_utils.py → utils/data.py} +147 -90
  149. tnfr/utils/data.pyi +64 -0
  150. tnfr/utils/graph.py +85 -0
  151. tnfr/utils/graph.pyi +10 -0
  152. tnfr/utils/init.py +770 -0
  153. tnfr/utils/init.pyi +78 -0
  154. tnfr/utils/io.py +456 -0
  155. tnfr/{helpers → utils}/numeric.py +51 -24
  156. tnfr/utils/numeric.pyi +21 -0
  157. tnfr/validation/__init__.py +113 -0
  158. tnfr/validation/__init__.pyi +77 -0
  159. tnfr/validation/compatibility.py +95 -0
  160. tnfr/validation/compatibility.pyi +6 -0
  161. tnfr/validation/grammar.py +71 -0
  162. tnfr/validation/grammar.pyi +40 -0
  163. tnfr/validation/graph.py +138 -0
  164. tnfr/validation/graph.pyi +17 -0
  165. tnfr/validation/rules.py +281 -0
  166. tnfr/validation/rules.pyi +55 -0
  167. tnfr/validation/runtime.py +263 -0
  168. tnfr/validation/runtime.pyi +31 -0
  169. tnfr/validation/soft_filters.py +170 -0
  170. tnfr/validation/soft_filters.pyi +37 -0
  171. tnfr/validation/spectral.py +159 -0
  172. tnfr/validation/spectral.pyi +46 -0
  173. tnfr/validation/syntax.py +40 -0
  174. tnfr/validation/syntax.pyi +10 -0
  175. tnfr/validation/window.py +39 -0
  176. tnfr/validation/window.pyi +1 -0
  177. tnfr/viz/__init__.py +9 -0
  178. tnfr/viz/matplotlib.py +246 -0
  179. tnfr-7.0.0.dist-info/METADATA +179 -0
  180. tnfr-7.0.0.dist-info/RECORD +185 -0
  181. {tnfr-4.5.2.dist-info → tnfr-7.0.0.dist-info}/licenses/LICENSE.md +1 -1
  182. tnfr/grammar.py +0 -344
  183. tnfr/graph_utils.py +0 -84
  184. tnfr/helpers/__init__.py +0 -71
  185. tnfr/import_utils.py +0 -228
  186. tnfr/json_utils.py +0 -162
  187. tnfr/logging_utils.py +0 -116
  188. tnfr/presets.py +0 -60
  189. tnfr/validators.py +0 -84
  190. tnfr/value_utils.py +0 -59
  191. tnfr-4.5.2.dist-info/METADATA +0 -379
  192. tnfr-4.5.2.dist-info/RECORD +0 -67
  193. {tnfr-4.5.2.dist-info → tnfr-7.0.0.dist-info}/WHEEL +0 -0
  194. {tnfr-4.5.2.dist-info → tnfr-7.0.0.dist-info}/entry_points.txt +0 -0
  195. {tnfr-4.5.2.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
+
@@ -0,0 +1,179 @@
1
+ Metadata-Version: 2.4
2
+ Name: tnfr
3
+ Version: 7.0.0
4
+ Summary: Modular structural-based dynamics on networks.
5
+ Author: fmg
6
+ License: MIT
7
+ Project-URL: Homepage, https://pypi.org/project/tnfr/
8
+ Project-URL: Repository, https://github.com/fermga/TNFR-Python-Engine
9
+ Project-URL: GPT, https://chatgpt.com/g/g-67abc78885a88191b2d67f94fd60dc97-tnfr-resonant-fractal-nature-theory
10
+ Keywords: TNFR,complex systems,fractals,resonance,networks,structural dynamics,structural analysis
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3 :: Only
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: License :: OSI Approved :: MIT License
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Intended Audience :: Science/Research
20
+ Classifier: Topic :: Scientific/Engineering
21
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
22
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
23
+ Requires-Python: >=3.9
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE.md
26
+ Requires-Dist: networkx>=2.6
27
+ Requires-Dist: cachetools>=5
28
+ Requires-Dist: typing-extensions>=4.4; python_version < "3.10"
29
+ Provides-Extra: numpy
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"
35
+ Provides-Extra: yaml
36
+ Requires-Dist: pyyaml>=6.0; extra == "yaml"
37
+ Provides-Extra: orjson
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"
51
+ Provides-Extra: test
52
+ Requires-Dist: pytest>=7; extra == "test"
53
+ Requires-Dist: pytest-benchmark>=4; extra == "test"
54
+ Requires-Dist: pydocstyle>=6; extra == "test"
55
+ Requires-Dist: coverage>=7; extra == "test"
56
+ Requires-Dist: hypothesis>=6; extra == "test"
57
+ Requires-Dist: hypothesis-networkx>=0.3; extra == "test"
58
+ Requires-Dist: flake8>=5; extra == "test"
59
+ Requires-Dist: flake8-pyproject>=1.2; extra == "test"
60
+ Requires-Dist: vulture>=2; extra == "test"
61
+ Requires-Dist: matplotlib>=3.7; extra == "test"
62
+ Provides-Extra: typecheck
63
+ Requires-Dist: mypy>=1.8; extra == "typecheck"
64
+ Requires-Dist: networkx-stubs>=0.0.1; extra == "typecheck"
65
+ Requires-Dist: types-cachetools>=6.0.0.0; extra == "typecheck"
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"
72
+ Dynamic: license-file
73
+
74
+ # TNFR Python Engine
75
+
76
+ Canonical implementation of the Resonant Fractal Nature Theory (TNFR) for modelling structural
77
+ coherence. The engine seeds resonant nodes, applies structural operators, coordinates
78
+ ΔNFR/phase dynamics, and measures coherence metrics (C(t), Si, νf) without breaking the nodal
79
+ equation $\partial EPI/\partial t = \nu_f \cdot \Delta NFR(t)$.
80
+
81
+ ## Snapshot
82
+
83
+ - **Operate:** build nodes with `tnfr.create_nfr`, execute trajectories via
84
+ `tnfr.structural.run_sequence`, and evolve dynamics with `tnfr.dynamics.run`.
85
+ - **Observe:** register metrics/trace callbacks to capture ΔNFR, C(t), Si, and structural
86
+ histories
87
+ for every run.
88
+ - **Extend:** rely on the canonical operator grammar and invariants before introducing new
89
+ utilities or telemetry.
90
+
91
+ ## Quickstart
92
+
93
+ Install from PyPI (Python ≥ 3.9):
94
+
95
+ ```bash
96
+ pip install tnfr
97
+ ```
98
+
99
+ Then follow the [quickstart guide](docs/source/getting-started/quickstart.md) for Python and CLI
100
+ walkthroughs plus optional dependency caching helpers.
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
+
119
+ ## Documentation map
120
+
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
124
+ workflows.
125
+ - [Telemetry & utilities](docs/source/api/telemetry.md) — coherence metrics, trace capture, locking,
126
+ and helper facades.
127
+ - [Examples](docs/source/examples/README.md) — runnable scenarios, CLI artefacts, and token legend.
128
+
129
+ ## Documentation build workflow
130
+
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:
133
+
134
+ 1. Create and activate a virtual environment (e.g. `python -m venv .venv && source .venv/bin/activate`).
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`.
140
+
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.
144
+
145
+ ## Local development
146
+
147
+ Use the helper scripts to keep formatting aligned with the canonical configuration and to reproduce
148
+ the quality gate locally:
149
+
150
+ ```bash
151
+ ./scripts/format.sh # Apply Black and isort across src/, tests/, scripts/, and benchmarks/
152
+ ./scripts/format.sh --check # Validate formatting without modifying files
153
+ ./scripts/run_tests.sh # Execute the full QA battery (type checks, tests, coverage, linting)
154
+ ```
155
+
156
+ The formatting helper automatically prefers `poetry run` when a Poetry environment is available and
157
+ falls back to `python -m` invocations so local runs mirror the tooling invoked in continuous
158
+ integration.
159
+
160
+ ## Additional resources
161
+
162
+ - [ARCHITECTURE.md](ARCHITECTURE.md) — orchestration layers and invariant enforcement.
163
+ - [CONTRIBUTING.md](CONTRIBUTING.md) — QA battery (`scripts/run_tests.sh`) and review
164
+ expectations.
165
+ - [TNFR.pdf](TNFR.pdf) — theoretical background, structural operators, and paradigm glossary.
166
+
167
+ ## Migration notes
168
+
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
172
+ :func:`tnfr.metrics.sense_index.compute_Si_node` rejects unknown keyword arguments.
173
+ - Refer to the [release notes](docs/source/releases.md#1100-si-dispersion-legacy-keys-removed) for
174
+ a migration snippet that rewrites stored graphs in place prior to running the new version.
175
+
176
+ ## Licensing
177
+
178
+ Released under the [MIT License](LICENSE.md). Cite the TNFR paradigm when publishing research
179
+ or derived artefacts based on this engine.
@@ -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