tnfr 4.3.0__py3-none-any.whl → 4.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

tnfr/types.py CHANGED
@@ -9,9 +9,10 @@ class NodeState:
9
9
  vf: float = 1.0 # νf
10
10
  theta: float = 0.0 # θ
11
11
  Si: float = 0.5
12
+ epi_kind: str = ""
12
13
  extra: Dict[str, Any] = field(default_factory=dict)
13
14
 
14
15
  def to_attrs(self) -> Dict[str, Any]:
15
- d = {"EPI": self.EPI, "νf": self.vf, "θ": self.theta, "Si": self.Si}
16
+ d = {"EPI": self.EPI, "νf": self.vf, "θ": self.theta, "Si": self.Si, "EPI_kind": self.epi_kind}
16
17
  d.update(self.extra)
17
18
  return d
tnfr/validators.py ADDED
@@ -0,0 +1,38 @@
1
+ """Validadores de invariantes TNFR."""
2
+
3
+ from __future__ import annotations
4
+ from typing import Iterable
5
+
6
+ from .constants import ALIAS_EPI, DEFAULTS
7
+ from .helpers import _get_attr
8
+ from .sense import sigma_vector_global, GLYPHS_CANONICAL
9
+ from .helpers import last_glifo
10
+
11
+
12
+ def _validate_epi(G) -> None:
13
+ emin = float(G.graph.get("EPI_MIN", DEFAULTS.get("EPI_MIN", -1.0)))
14
+ emax = float(G.graph.get("EPI_MAX", DEFAULTS.get("EPI_MAX", 1.0)))
15
+ for n in G.nodes():
16
+ x = float(_get_attr(G.nodes[n], ALIAS_EPI, 0.0))
17
+ if not (emin - 1e-9 <= x <= emax + 1e-9):
18
+ raise ValueError(f"EPI fuera de rango en nodo {n}: {x}")
19
+
20
+
21
+ def _validate_sigma(G) -> None:
22
+ sv = sigma_vector_global(G)
23
+ if sv.get("mag", 0.0) > 1.0 + 1e-9:
24
+ raise ValueError("Norma de σ excede 1")
25
+
26
+
27
+ def _validate_glifos(G) -> None:
28
+ for n in G.nodes():
29
+ g = last_glifo(G.nodes[n])
30
+ if g and g not in GLYPHS_CANONICAL:
31
+ raise ValueError(f"Glifo inválido {g} en nodo {n}")
32
+
33
+
34
+ def run_validators(G) -> None:
35
+ """Ejecuta todos los validadores de invariantes sobre ``G``."""
36
+ _validate_epi(G)
37
+ _validate_sigma(G)
38
+ _validate_glifos(G)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tnfr
3
- Version: 4.3.0
3
+ Version: 4.5.0
4
4
  Summary: Canonical TNFR: modular glyph-based dynamics on networks.
5
5
  Author: fmg
6
6
  License: MIT
@@ -25,7 +25,7 @@ License-File: LICENSE.md
25
25
  Requires-Dist: networkx>=2.6
26
26
  Dynamic: license-file
27
27
 
28
- # TNFR Canonical Glyph-Based Dynamics
28
+ # TNFR Python Project
29
29
 
30
30
  Reference implementation of the Resonant Fractal Nature Theory (TNFR).
31
31
  It models glyph-driven dynamics on NetworkX graphs, providing a modular
@@ -0,0 +1,28 @@
1
+ tnfr/__init__.py,sha256=c3fypVJdVZeV-AEZEPsr4NZZRwH9reGEBwoNnT9dP88,2788
2
+ tnfr/cli.py,sha256=7OR3dlWUVjEKVH_itH-zYq8WQculXwSdCDDvmQH15kY,14372
3
+ tnfr/config.py,sha256=bFc5AnLVoF0oUrSedAi5WpD6oCvn4hhLHO7WGgslg2M,1303
4
+ tnfr/constants.py,sha256=XoUlTuUaQgQ6BbHzKSIHijqRMf9Gb3Avjo7_CLicgps,11570
5
+ tnfr/dynamics.py,sha256=An0MlAJVhCy5uCQsl3c_PZKdAKBZojgRCnTAQzfaahg,32799
6
+ tnfr/gamma.py,sha256=U1yXbv4ef9VSwXirjRlcwdNr78Ah5LstAsg5WIkRQxY,4083
7
+ tnfr/grammar.py,sha256=vz5F0P3IfvA6HassRcoD327hBP5vCUw-xPSTsPmqwhQ,5363
8
+ tnfr/helpers.py,sha256=KT9_CAz3Z-WRKdARyGnsQ16m-p2z-l1-Y6UhVyY8tcU,8323
9
+ tnfr/main.py,sha256=XqjI1YEdF-OqRzTMa5dYIxCig4qyAR-l1FPcyxpC8WY,1926
10
+ tnfr/metrics.py,sha256=MTp0YifWdycW-jUFWhvxbJx-labWUR0thTnS0sxifrg,20259
11
+ tnfr/node.py,sha256=A3nlaW_lwG0Q1dj6HPmyjfccWfZt4rwnzqPxTglu-Sk,6184
12
+ tnfr/observers.py,sha256=PTw3hxk7KD-Yx_CvCIU09icuhyYD6uNU6SvF80UvP-Y,5354
13
+ tnfr/ontosim.py,sha256=9GfEtiLIdJOPJUTufcq_MssAA9J8AfChHU6HKb3DIJY,5628
14
+ tnfr/operators.py,sha256=TSY2LNIC-um3iSwniYiyu6oumnDwiES2zwb2B7ZbEZE,20536
15
+ tnfr/presets.py,sha256=qFuDxlexc_kw--3VRaOx3cfyL6vPEOX_UVsJd2DNWAE,998
16
+ tnfr/program.py,sha256=eim7D8zsbbkGDWbODag-0VKG44jEYioX4Sl6KRwgVtw,6038
17
+ tnfr/scenarios.py,sha256=QkUdCHp5R5T44fgfGppJ8dHzZa6avdNTNsYJbya_7XM,1165
18
+ tnfr/sense.py,sha256=9ABkqHjwu5pxoakddZwANpp9xy_NNo4frm9NGTg1GXQ,6482
19
+ tnfr/structural.py,sha256=hE5_l7cuiPad9AuFVrFtnkJ8A8eL_e69gUN5VknkQiI,5155
20
+ tnfr/trace.py,sha256=e_xdOOMZ5rqXOcdw99h8X1RnVuf_s9AeTzncqS551hE,4735
21
+ tnfr/types.py,sha256=CnSwzzh9d0WgqB128y71iNWiiAA7Sf-eJ_v1xHMAwLo,507
22
+ tnfr/validators.py,sha256=tCsz9A8OvEKiBZX9wvvri_C894XXdWfkbEZ6qqpcdNg,1169
23
+ tnfr-4.5.0.dist-info/licenses/LICENSE.md,sha256=SRvvhXLrKtseuK6DARbuJffuXOXqAyk3wvF2n0t1SWA,1109
24
+ tnfr-4.5.0.dist-info/METADATA,sha256=k7dlvh_IujIeTJfUfQXvCV9h6RbbtQvIbsJ3ylKUHTo,6301
25
+ tnfr-4.5.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
26
+ tnfr-4.5.0.dist-info/entry_points.txt,sha256=j4-QRHqeT2WnchHe_mvK7npGTLjlyfLpvRONFe9Z4MU,39
27
+ tnfr-4.5.0.dist-info/top_level.txt,sha256=Q2HJnvc5Rt2VHwVvyBTnNPT4SfmJWnCj7XUxxEvQa7c,5
28
+ tnfr-4.5.0.dist-info/RECORD,,
@@ -1,24 +0,0 @@
1
- tnfr/__init__.py,sha256=g3v2NoMYZuOvxALTpNMyj-bddJDyQWaZ5poV6vFYqCg,2051
2
- tnfr/cli.py,sha256=DyJlawWo-mC44RZz4UR4WseqZymcc_zfo49ivZjtkxY,11744
3
- tnfr/constants.py,sha256=PTAX5ZGCiU2lmBNSIsmS402BWS-oTKhQV6wBGL_-SxM,9549
4
- tnfr/dynamics.py,sha256=913qUr-Jv495ocPBzd6vxkhKIKrKXXkqnBNzrUlnj7A,27556
5
- tnfr/gamma.py,sha256=7ZOYoa0dMyxapu_ok8syWa6fIIdgR5XGgNhVIf1Np44,3466
6
- tnfr/grammar.py,sha256=vz5F0P3IfvA6HassRcoD327hBP5vCUw-xPSTsPmqwhQ,5363
7
- tnfr/helpers.py,sha256=2Y6hEShM3EHxRIYCir2GvxZWtRVAUTw9ERKITf_BcIw,7873
8
- tnfr/main.py,sha256=XqjI1YEdF-OqRzTMa5dYIxCig4qyAR-l1FPcyxpC8WY,1926
9
- tnfr/metrics.py,sha256=z85robiGF9CDVPen98fN00Qih7xknqvrkGOW_BIkGUs,7769
10
- tnfr/observers.py,sha256=PTw3hxk7KD-Yx_CvCIU09icuhyYD6uNU6SvF80UvP-Y,5354
11
- tnfr/ontosim.py,sha256=9GfEtiLIdJOPJUTufcq_MssAA9J8AfChHU6HKb3DIJY,5628
12
- tnfr/operators.py,sha256=aEiWF_9XLTsREe56urEH6aU_Hpu5tGxPbg4cWcGBLvs,15139
13
- tnfr/presets.py,sha256=qFuDxlexc_kw--3VRaOx3cfyL6vPEOX_UVsJd2DNWAE,998
14
- tnfr/program.py,sha256=eim7D8zsbbkGDWbODag-0VKG44jEYioX4Sl6KRwgVtw,6038
15
- tnfr/scenarios.py,sha256=QkUdCHp5R5T44fgfGppJ8dHzZa6avdNTNsYJbya_7XM,1165
16
- tnfr/sense.py,sha256=9ABkqHjwu5pxoakddZwANpp9xy_NNo4frm9NGTg1GXQ,6482
17
- tnfr/trace.py,sha256=e_xdOOMZ5rqXOcdw99h8X1RnVuf_s9AeTzncqS551hE,4735
18
- tnfr/types.py,sha256=xyFHp0PptEqPNUekAFH6DcAnyMx4bCQutMyFUXMd2sA,457
19
- tnfr-4.3.0.dist-info/licenses/LICENSE.md,sha256=SRvvhXLrKtseuK6DARbuJffuXOXqAyk3wvF2n0t1SWA,1109
20
- tnfr-4.3.0.dist-info/METADATA,sha256=L25IajD448ZSlOLJikBDahMQzl8LQCSKdMfOUVJEx3g,6321
21
- tnfr-4.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
22
- tnfr-4.3.0.dist-info/entry_points.txt,sha256=j4-QRHqeT2WnchHe_mvK7npGTLjlyfLpvRONFe9Z4MU,39
23
- tnfr-4.3.0.dist-info/top_level.txt,sha256=Q2HJnvc5Rt2VHwVvyBTnNPT4SfmJWnCj7XUxxEvQa7c,5
24
- tnfr-4.3.0.dist-info/RECORD,,
File without changes