tnfr 1.0__py3-none-any.whl → 2.0.1__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 +47 -34
- tnfr/constants.py +183 -7
- tnfr/dynamics.py +543 -0
- tnfr/helpers.py +198 -0
- tnfr/main.py +0 -0
- tnfr/observers.py +149 -0
- tnfr/ontosim.py +137 -0
- tnfr/operators.py +296 -0
- tnfr-2.0.1.dist-info/METADATA +28 -0
- tnfr-2.0.1.dist-info/RECORD +14 -0
- tnfr-2.0.1.dist-info/entry_points.txt +2 -0
- tnfr-2.0.1.dist-info/top_level.txt +1 -0
- core/ontosim.py +0 -757
- matrix/operators.py +0 -496
- tnfr/core/ontosim.py +0 -1074
- tnfr/matrix/operators.py +0 -500
- tnfr/resonance/dynamics.py +0 -1305
- tnfr/utils/helpers.py +0 -357
- tnfr-1.0.dist-info/METADATA +0 -95
- tnfr-1.0.dist-info/RECORD +0 -14
- tnfr-1.0.dist-info/entry_points.txt +0 -2
- tnfr-1.0.dist-info/top_level.txt +0 -3
- {tnfr-1.0.dist-info → tnfr-2.0.1.dist-info}/WHEEL +0 -0
- {tnfr-1.0.dist-info → tnfr-2.0.1.dist-info}/licenses/LICENSE.txt +0 -0
tnfr/__init__.py
CHANGED
|
@@ -1,34 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
""
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import argparse
|
|
3
|
+
import sys
|
|
4
|
+
import networkx as nx
|
|
5
|
+
|
|
6
|
+
from . import preparar_red, run, attach_standard_observer, __version__
|
|
7
|
+
|
|
8
|
+
def main(argv: list[str] | None = None) -> None:
|
|
9
|
+
p = argparse.ArgumentParser(
|
|
10
|
+
prog="tnfr",
|
|
11
|
+
description="TNFR canónica — demo CLI (orquesta step/run sobre una red aleatoria)",
|
|
12
|
+
)
|
|
13
|
+
p.add_argument("--version", action="store_true", help="muestra versión y sale")
|
|
14
|
+
p.add_argument("--n", type=int, default=30, help="nodos (Erdős–Rényi)")
|
|
15
|
+
p.add_argument("--p", type=float, default=0.15, help="probabilidad de arista (Erdős–Rényi)")
|
|
16
|
+
p.add_argument("--steps", type=int, default=100, help="pasos a simular")
|
|
17
|
+
p.add_argument("--observer", action="store_true", help="adjunta observador estándar")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
args = p.parse_args(argv)
|
|
21
|
+
if args.version:
|
|
22
|
+
print(__version__)
|
|
23
|
+
return
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
G = nx.erdos_renyi_graph(args.n, args.p)
|
|
27
|
+
G.graph["ATTACH_STD_OBSERVER"] = bool(args.observer)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
preparar_red(G)
|
|
31
|
+
run(G, args.steps)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# resumen rápido al final
|
|
35
|
+
h = G.graph.get("history", {})
|
|
36
|
+
C = h.get("C_steps", [])[-1] if h.get("C_steps") else None
|
|
37
|
+
stab = h.get("stable_frac", [])[-1] if h.get("stable_frac") else None
|
|
38
|
+
R = h.get("kuramoto_R", [])[-1] if h.get("kuramoto_R") else None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
print("TNFR terminado:")
|
|
42
|
+
if C is not None: print(f" C(t) ~ {C:.3f}")
|
|
43
|
+
if stab is not None: print(f" estable ~ {stab:.3f}")
|
|
44
|
+
if R is not None: print(f" R (Kuramoto) ~ {R:.3f}")
|
|
45
|
+
|
|
46
|
+
if __name__ == "__main__":
|
|
47
|
+
main(sys.argv[1:])
|
tnfr/constants.py
CHANGED
|
@@ -1,7 +1,183 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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")
|