tnfr 1.0__py3-none-any.whl → 3.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 CHANGED
@@ -1,34 +1,48 @@
1
+ from __future__ import annotations
2
+
1
3
  """
2
- TNFR - Teoría de la Naturaleza Fractal Resonante
3
- Simulador simbólico de coherencia emergente
4
+ TNFR Teoría de la Naturaleza Fractal Resonante
5
+ API canónica del paquete.
6
+
7
+ Principio operativo (ecuación nodal):
8
+ ∂EPI/∂t = νf · ΔNFR(t)
9
+
10
+ Este paquete expone utilidades para preparar una red (preparar_red),
11
+ ejecutar la dinámica (step, run) y observar coherencia (coherencia_global,
12
+ orden_kuramoto), alineado con la TNFR.
4
13
  """
5
14
 
6
- __version__ = "0.1.0"
7
-
8
- # Importar TODO usando * con __all__ controlado
9
- from .core.ontosim import *
10
- from .matrix.operators import *
11
- from .resonance.dynamics import *
12
- from .utils.helpers import *
13
-
14
- # Funciones de conveniencia
15
- def crear_simulacion_basica(datos_nodos, pasos=250):
16
- """Función de conveniencia para crear y ejecutar una simulación TNFR básica."""
17
- red = crear_red_desde_datos(datos_nodos)
18
- historia, red_final, epis, lecturas, _, historial_glifos, _, stats = simular_emergencia(red, pasos)
19
-
20
- return {
21
- 'historia': historia,
22
- 'red_final': red_final,
23
- 'epis_compuestas': epis,
24
- 'lecturas_sintacticas': lecturas,
25
- 'historial_glifos': historial_glifos,
26
- 'estadisticas_bifurcacion': stats
27
- }
28
-
29
- def version_info():
30
- """Retorna información del paquete TNFR."""
31
- return {
32
- 'version': __version__,
33
- 'modulos': ['core', 'matrix', 'resonance', 'utils']
34
- }
15
+ __version__ = "3.0.0"
16
+
17
+ # Re-exports de la API pública
18
+ from .ontosim import preparar_red
19
+ from .dynamics import step, run, set_delta_nfr_hook
20
+ from .observers import attach_standard_observer, coherencia_global, orden_kuramoto
21
+
22
+ __all__ = [
23
+ "preparar_red",
24
+ "step", "run", "set_delta_nfr_hook",
25
+ "attach_standard_observer", "coherencia_global", "orden_kuramoto",
26
+ "__version__",
27
+ ]
28
+
29
+ # --- Adaptador de imports internos (compatibilidad sin tocar tus módulos) ---
30
+ # Varios archivos del paquete usan imports absolutos como:
31
+ # from constants import DEFAULTS
32
+ # en lugar de imports relativos:
33
+ # from .constants import DEFAULTS
34
+ # Para no reescribirlos, registramos alias en sys.modules.
35
+ import sys as _sys
36
+ from . import constants as _constants
37
+ from . import helpers as _helpers
38
+ from . import observers as _observers
39
+ from . import dynamics as _dynamics
40
+ from . import operators as _operators
41
+ from . import ontosim as _ontosim
42
+
43
+ _sys.modules.setdefault("constants", _constants)
44
+ _sys.modules.setdefault("helpers", _helpers)
45
+ _sys.modules.setdefault("observers", _observers)
46
+ _sys.modules.setdefault("dynamics", _dynamics)
47
+ _sys.modules.setdefault("operators", _operators)
48
+ _sys.modules.setdefault("ontosim", _ontosim)
tnfr/constants.py CHANGED
@@ -1,7 +1,183 @@
1
- glifo_categoria = {
2
- "AL": "activador", "EN": "receptor", "IL": "estabilizador",
3
- "OZ": "disonante", "UM": "acoplador", "RA": "resonador",
4
- "SHA": "latente", "VAL": "expansivo", "NUL": "contractivo",
5
- "THOL": "autoorganizador", "ZHIR": "mutante", "NAV": "transicional",
6
- "REMESH": "recursivo"
7
- }
1
+ """
2
+ constants.py TNFR canónica
3
+
4
+ Centraliza parámetros por defecto y nombres que usan el resto de módulos.
5
+ Provee utilidades para inyectarlos en G.graph.
6
+ """
7
+ from __future__ import annotations
8
+ from typing import Dict, Any
9
+
10
+ # -------------------------
11
+ # Parámetros canónicos
12
+ # -------------------------
13
+ DEFAULTS: Dict[str, Any] = {
14
+ # Discretización
15
+ "DT": 1.0,
16
+
17
+ # Rango de EPI (estructura primaria)
18
+ "EPI_MIN": -1.0,
19
+ "EPI_MAX": 1.0,
20
+ # Alias histórico usado por algunos proyectos
21
+ "EPI_MAX_GLOBAL": 1.0,
22
+
23
+ # Rango de frecuencia estructural νf
24
+ "VF_MIN": 0.0,
25
+ "VF_MAX": 1.0,
26
+
27
+ # Envolvente de fase
28
+ "THETA_WRAP": True,
29
+
30
+ # --- Inicialización (evitar simetrías) ---
31
+ "INIT_RANDOM_PHASE": True, # si True, θ ~ U[-π, π]
32
+ "INIT_THETA_MIN": -3.141592653589793,
33
+ "INIT_THETA_MAX": 3.141592653589793,
34
+
35
+ "INIT_VF_MODE": "uniform", # "uniform" | "normal"
36
+ # para uniform:
37
+ "INIT_VF_MIN": None, # si None → usa VF_MIN
38
+ "INIT_VF_MAX": None, # si None → usa VF_MAX
39
+ # para normal:
40
+ "INIT_VF_MEAN": 0.5,
41
+ "INIT_VF_STD": 0.15,
42
+ # clamp de νf a límites canónicos
43
+ "INIT_VF_CLAMP_TO_LIMITS": True,
44
+
45
+
46
+ # Mezcla para ΔNFR (campo nodal)
47
+ # phase: dispersión de fase local; epi: gradiente de EPI; vf: desajuste de νf
48
+ "DNFR_WEIGHTS": {"phase": 0.34, "epi": 0.33, "vf": 0.33},
49
+
50
+ # Índice de sentido Si = α·νf_norm + β·(1 - disp_fase) + γ·(1 - |ΔNFR|/max)
51
+ "SI_WEIGHTS": {"alpha": 0.34, "beta": 0.33, "gamma": 0.33},
52
+
53
+ # Coordinación de fase (U’M) global/vecinal por paso
54
+ "PHASE_K_GLOBAL": 0.05,
55
+ "PHASE_K_LOCAL": 0.15,
56
+
57
+ # Coordinación de fase adaptativa (kG/kL dinámicos por estado)
58
+ "PHASE_ADAPT": {
59
+ "enabled": True, # activar adaptación automática si no se pasan fuerzas explícitas a la función
60
+ "R_hi": 0.90, # sincronía alta (Kuramoto R) => estado ESTABLE
61
+ "R_lo": 0.60, # sincronía baja => estado DISONANTE
62
+ "disr_hi": 0.50, # carga glífica disruptiva alta => DISONANTE
63
+ "disr_lo": 0.25, # carga glífica disruptiva baja + R alta => ESTABLE
64
+ "kG_min": 0.01, "kG_max": 0.20,
65
+ "kL_min": 0.05, "kL_max": 0.25,
66
+ "up": 0.10, # velocidad de subida hacia el objetivo
67
+ "down": 0.07 # velocidad de bajada hacia el objetivo
68
+ },
69
+
70
+ "STOP_EARLY": {"enabled": False, "window": 25, "fraction": 0.90},
71
+
72
+ # Criterios de estabilidad (para activar RE’MESH de red)
73
+ "EPS_DNFR_STABLE": 1e-3,
74
+ "EPS_DEPI_STABLE": 1e-3,
75
+ "FRACTION_STABLE_REMESH": 0.80, # fracción de nodos estables requerida
76
+ "REMESH_COOLDOWN_VENTANA": 20, # pasos mínimos entre RE’MESH
77
+ # Gating adicional basado en observadores (conmutador + ventana)
78
+ "REMESH_REQUIRE_STABILITY": False, # si True, exige ventana de estabilidad multi-métrica
79
+ "REMESH_STABILITY_WINDOW": 25, # tamaño de ventana para evaluar estabilidad
80
+ "REMESH_MIN_PHASE_SYNC": 0.85, # media mínima de sincronía de fase en ventana
81
+ "REMESH_MAX_GLYPH_DISR": 0.35, # media máxima de carga glífica disruptiva en ventana
82
+ "REMESH_LOG_EVENTS": True, # guarda eventos y metadatos del RE’MESH
83
+
84
+ # RE’MESH: memoria τ y mezcla α
85
+ "REMESH_TAU": 8, # pasos hacia atrás
86
+ "REMESH_ALPHA": 0.5, # mezcla con pasado
87
+
88
+ # Histéresis glífica
89
+ "GLYPH_HYSTERESIS_WINDOW": 7,
90
+
91
+ # Margen de histéresis del selector (cuánto "aguanta" sin cambiar glifo si está cerca de un umbral)
92
+ "GLYPH_SELECTOR_MARGIN": 0.05,
93
+
94
+ # Ventana para estimar la carga glífica en history/plots
95
+ "GLYPH_LOAD_WINDOW": 50,
96
+
97
+ # Tamaño de ventana para coherencia promedio W̄
98
+ "WBAR_WINDOW": 25,
99
+
100
+ # Factores suaves por glifo (operadores)
101
+ "GLYPH_FACTORS": {
102
+ "AL_boost": 0.05, # A’L — pequeña emisión
103
+ "EN_mix": 0.25, # E’N — mezcla con vecindad
104
+ "IL_dnfr_factor": 0.7, # I’L — reduce ΔNFR
105
+ "OZ_dnfr_factor": 1.3, # O’Z — aumenta ΔNFR
106
+ "UM_theta_push": 0.25, # U’M — empuje adicional de fase local
107
+ "RA_epi_diff": 0.15, # R’A — difusión EPI
108
+ "SHA_vf_factor": 0.85, # SH’A — baja νf
109
+ "VAL_scale": 1.15, # VA’L — expande EPI
110
+ "NUL_scale": 0.85, # NU’L — contrae EPI
111
+ "THOL_accel": 0.10, # T’HOL — acelera (seg. deriv.) si hay umbral
112
+ "ZHIR_theta_shift": 1.57079632679, # Z’HIR — desplazamiento ~π/2
113
+ "NAV_jitter": 0.05, # NA’V — pequeña inestabilidad creativa
114
+ "REMESH_alpha": 0.5, # RE’MESH — mezcla si no se usa REMESH_ALPHA
115
+ },
116
+
117
+ # Umbrales para el selector glífico por defecto
118
+ "GLYPH_THRESHOLDS": {"hi": 0.66, "lo": 0.33, "dnfr": 1e-3},
119
+
120
+ # Comportamiento NA’V
121
+ "NAV_RANDOM": True, # si True, usa jitter aleatorio en [-j, j]; si False, jitter determinista por signo
122
+ "RANDOM_SEED": 0, # semilla base para reproducibilidad del jitter
123
+
124
+ # Modo ruido para O’Z
125
+ "OZ_NOISE_MODE": False, # si True, añade ruido aditivo en ΔNFR
126
+ "OZ_SIGMA": 0.1, # amplitud del ruido uniforme [-σ, σ]
127
+
128
+ # Gramática glífica (suave): evita repetir ciertos glifos salvo que el campo lo exija
129
+ "GRAMMAR": {
130
+ "window": 3, # cuántos pasos recientes miramos por nodo
131
+ "avoid_repeats": ["Z’HIR", "O’Z", "T’HOL"],
132
+ "force_dnfr": 0.60, # si |ΔNFR|_norm ≥ este valor, se permite repetir
133
+ "force_accel": 0.60, # o si |accel|_norm ≥ este valor
134
+ "fallbacks": { # a qué glifo caer si se bloquea el candidato
135
+ "Z’HIR": "NA’V",
136
+ "O’Z": "Z’HIR",
137
+ "T’HOL": "NA’V"
138
+ }
139
+ },
140
+
141
+ # --- Selector multiobjetivo ---
142
+ # Ponderaciones (se reescalan a 1 automáticamente)
143
+ "SELECTOR_WEIGHTS": {"w_si": 0.5, "w_dnfr": 0.3, "w_accel": 0.2},
144
+ # Umbrales hi/lo para decidir categorías (trabajan con |ΔNFR|_norm y |accel|_norm)
145
+ "SELECTOR_THRESHOLDS": {
146
+ "si_hi": 0.66, "si_lo": 0.33,
147
+ "dnfr_hi": 0.50, "dnfr_lo": 0.10,
148
+ "accel_hi": 0.50, "accel_lo": 0.10
149
+ },
150
+ # Callbacks Γ(R)
151
+ "CALLBACKS_STRICT": False, # si True, un error en callback detiene; si False, se loguea y continúa
152
+ }
153
+
154
+
155
+ # -------------------------
156
+ # Utilidades
157
+ # -------------------------
158
+
159
+ def attach_defaults(G, override: bool = False) -> None:
160
+ """Escribe DEFAULTS en G.graph (sin sobreescribir si override=False)."""
161
+ G.graph.setdefault("_tnfr_defaults_attached", False)
162
+ for k, v in DEFAULTS.items():
163
+ if override or k not in G.graph:
164
+ G.graph[k] = v
165
+ G.graph["_tnfr_defaults_attached"] = True
166
+
167
+
168
+ def merge_overrides(G, **overrides) -> None:
169
+ """Aplica cambios puntuales a G.graph.
170
+ Útil para ajustar pesos sin tocar DEFAULTS globales.
171
+ """
172
+ for k, v in overrides.items():
173
+ G.graph[k] = v
174
+
175
+
176
+ # Alias exportados por conveniencia (evita imports circulares)
177
+ ALIAS_VF = ("νf", "nu_f", "nu-f", "nu", "freq", "frequency")
178
+ ALIAS_THETA = ("θ", "theta", "fase", "phi", "phase")
179
+ ALIAS_DNFR = ("ΔNFR", "delta_nfr", "dnfr")
180
+ ALIAS_EPI = ("EPI", "psi", "PSI", "value")
181
+ ALIAS_SI = ("Si", "sense_index", "S_i", "sense", "meaning_index")
182
+ ALIAS_dEPI = ("dEPI_dt", "dpsi_dt", "dEPI", "velocity")
183
+ ALIAS_D2EPI = ("d2EPI_dt2", "d2psi_dt2", "d2EPI", "accel")