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.
- tnfr/__init__.py +50 -5
- tnfr/__init__.pyi +0 -7
- tnfr/_compat.py +0 -1
- tnfr/_generated_version.py +34 -0
- tnfr/_version.py +44 -2
- tnfr/alias.py +14 -13
- tnfr/alias.pyi +5 -37
- tnfr/cache.py +9 -729
- tnfr/cache.pyi +8 -224
- tnfr/callback_utils.py +16 -31
- tnfr/callback_utils.pyi +3 -29
- tnfr/cli/__init__.py +17 -11
- tnfr/cli/__init__.pyi +0 -21
- tnfr/cli/arguments.py +175 -14
- tnfr/cli/arguments.pyi +5 -11
- tnfr/cli/execution.py +434 -48
- tnfr/cli/execution.pyi +14 -24
- tnfr/cli/utils.py +20 -3
- tnfr/cli/utils.pyi +5 -5
- tnfr/config/__init__.py +2 -1
- tnfr/config/__init__.pyi +2 -0
- tnfr/config/feature_flags.py +83 -0
- tnfr/config/init.py +1 -1
- tnfr/config/operator_names.py +1 -14
- tnfr/config/presets.py +6 -26
- tnfr/constants/__init__.py +10 -13
- tnfr/constants/__init__.pyi +10 -22
- tnfr/constants/aliases.py +31 -0
- tnfr/constants/core.py +4 -3
- tnfr/constants/init.py +1 -1
- tnfr/constants/metric.py +3 -3
- tnfr/dynamics/__init__.py +64 -10
- tnfr/dynamics/__init__.pyi +3 -4
- tnfr/dynamics/adaptation.py +79 -13
- tnfr/dynamics/aliases.py +10 -9
- tnfr/dynamics/coordination.py +77 -35
- tnfr/dynamics/dnfr.py +575 -274
- tnfr/dynamics/dnfr.pyi +1 -10
- tnfr/dynamics/integrators.py +47 -33
- tnfr/dynamics/integrators.pyi +0 -1
- tnfr/dynamics/runtime.py +489 -129
- tnfr/dynamics/sampling.py +2 -0
- tnfr/dynamics/selectors.py +101 -62
- tnfr/execution.py +15 -8
- tnfr/execution.pyi +5 -25
- tnfr/flatten.py +7 -3
- tnfr/flatten.pyi +1 -8
- tnfr/gamma.py +22 -26
- tnfr/gamma.pyi +0 -6
- tnfr/glyph_history.py +37 -26
- tnfr/glyph_history.pyi +1 -19
- tnfr/glyph_runtime.py +16 -0
- tnfr/glyph_runtime.pyi +9 -0
- tnfr/immutable.py +20 -15
- tnfr/immutable.pyi +4 -7
- tnfr/initialization.py +5 -7
- tnfr/initialization.pyi +1 -9
- tnfr/io.py +6 -305
- tnfr/io.pyi +13 -8
- tnfr/mathematics/__init__.py +81 -0
- tnfr/mathematics/backend.py +426 -0
- tnfr/mathematics/dynamics.py +398 -0
- tnfr/mathematics/epi.py +254 -0
- tnfr/mathematics/generators.py +222 -0
- tnfr/mathematics/metrics.py +119 -0
- tnfr/mathematics/operators.py +233 -0
- tnfr/mathematics/operators_factory.py +71 -0
- tnfr/mathematics/projection.py +78 -0
- tnfr/mathematics/runtime.py +173 -0
- tnfr/mathematics/spaces.py +247 -0
- tnfr/mathematics/transforms.py +292 -0
- tnfr/metrics/__init__.py +10 -10
- tnfr/metrics/coherence.py +123 -94
- tnfr/metrics/common.py +22 -13
- tnfr/metrics/common.pyi +42 -11
- tnfr/metrics/core.py +72 -14
- tnfr/metrics/diagnosis.py +48 -57
- tnfr/metrics/diagnosis.pyi +3 -7
- tnfr/metrics/export.py +3 -5
- tnfr/metrics/glyph_timing.py +41 -31
- tnfr/metrics/reporting.py +13 -6
- tnfr/metrics/sense_index.py +884 -114
- tnfr/metrics/trig.py +167 -11
- tnfr/metrics/trig.pyi +1 -0
- tnfr/metrics/trig_cache.py +112 -15
- tnfr/node.py +400 -17
- tnfr/node.pyi +55 -38
- tnfr/observers.py +111 -8
- tnfr/observers.pyi +0 -15
- tnfr/ontosim.py +9 -6
- tnfr/ontosim.pyi +0 -5
- tnfr/operators/__init__.py +529 -42
- tnfr/operators/__init__.pyi +14 -0
- tnfr/operators/definitions.py +350 -18
- tnfr/operators/definitions.pyi +0 -14
- tnfr/operators/grammar.py +760 -0
- tnfr/operators/jitter.py +28 -22
- tnfr/operators/registry.py +7 -12
- tnfr/operators/registry.pyi +0 -2
- tnfr/operators/remesh.py +38 -61
- tnfr/rng.py +17 -300
- tnfr/schemas/__init__.py +8 -0
- tnfr/schemas/grammar.json +94 -0
- tnfr/selector.py +3 -4
- tnfr/selector.pyi +1 -1
- tnfr/sense.py +22 -24
- tnfr/sense.pyi +0 -7
- tnfr/structural.py +504 -21
- tnfr/structural.pyi +41 -18
- tnfr/telemetry/__init__.py +23 -1
- tnfr/telemetry/cache_metrics.py +226 -0
- tnfr/telemetry/nu_f.py +423 -0
- tnfr/telemetry/nu_f.pyi +123 -0
- tnfr/tokens.py +1 -4
- tnfr/tokens.pyi +1 -6
- tnfr/trace.py +20 -53
- tnfr/trace.pyi +9 -37
- tnfr/types.py +244 -15
- tnfr/types.pyi +200 -14
- tnfr/units.py +69 -0
- tnfr/units.pyi +16 -0
- tnfr/utils/__init__.py +107 -48
- tnfr/utils/__init__.pyi +80 -11
- tnfr/utils/cache.py +1705 -65
- tnfr/utils/cache.pyi +370 -58
- tnfr/utils/chunks.py +104 -0
- tnfr/utils/chunks.pyi +21 -0
- tnfr/utils/data.py +95 -5
- tnfr/utils/data.pyi +8 -17
- tnfr/utils/graph.py +2 -4
- tnfr/utils/init.py +31 -7
- tnfr/utils/init.pyi +4 -11
- tnfr/utils/io.py +313 -14
- tnfr/{helpers → utils}/numeric.py +50 -24
- tnfr/utils/numeric.pyi +21 -0
- tnfr/validation/__init__.py +92 -4
- tnfr/validation/__init__.pyi +77 -17
- tnfr/validation/compatibility.py +79 -43
- tnfr/validation/compatibility.pyi +4 -6
- tnfr/validation/grammar.py +55 -133
- tnfr/validation/grammar.pyi +37 -8
- tnfr/validation/graph.py +138 -0
- tnfr/validation/graph.pyi +17 -0
- tnfr/validation/rules.py +161 -74
- tnfr/validation/rules.pyi +55 -18
- tnfr/validation/runtime.py +263 -0
- tnfr/validation/runtime.pyi +31 -0
- tnfr/validation/soft_filters.py +170 -0
- tnfr/validation/soft_filters.pyi +37 -0
- tnfr/validation/spectral.py +159 -0
- tnfr/validation/spectral.pyi +46 -0
- tnfr/validation/syntax.py +28 -139
- tnfr/validation/syntax.pyi +7 -4
- tnfr/validation/window.py +39 -0
- tnfr/validation/window.pyi +1 -0
- tnfr/viz/__init__.py +9 -0
- tnfr/viz/matplotlib.py +246 -0
- {tnfr-6.0.0.dist-info → tnfr-7.0.0.dist-info}/METADATA +63 -19
- tnfr-7.0.0.dist-info/RECORD +185 -0
- {tnfr-6.0.0.dist-info → tnfr-7.0.0.dist-info}/licenses/LICENSE.md +1 -1
- tnfr/constants_glyphs.py +0 -16
- tnfr/constants_glyphs.pyi +0 -12
- tnfr/grammar.py +0 -25
- tnfr/grammar.pyi +0 -13
- tnfr/helpers/__init__.py +0 -151
- tnfr/helpers/__init__.pyi +0 -66
- tnfr/helpers/numeric.pyi +0 -12
- tnfr/presets.py +0 -15
- tnfr/presets.pyi +0 -7
- tnfr/utils/io.pyi +0 -10
- tnfr/utils/validators.py +0 -130
- tnfr/utils/validators.pyi +0 -19
- tnfr-6.0.0.dist-info/RECORD +0 -157
- {tnfr-6.0.0.dist-info → tnfr-7.0.0.dist-info}/WHEEL +0 -0
- {tnfr-6.0.0.dist-info → tnfr-7.0.0.dist-info}/entry_points.txt +0 -0
- {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:
|
|
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-
|
|
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/
|
|
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
|
|
91
|
-
|
|
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
|
|
95
|
-
|
|
96
|
-
|
|
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 &&
|
|
99
|
-
and publishes the resulting `
|
|
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:**
|
|
126
|
-
|
|
127
|
-
|
|
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
|
|
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
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
|