discrete.surgery¶
surgery ¶
Módulo de Cirugía Topológica.
Implementa el motor de cicatrización de redes complejas (Paper II). Ejecuta podas asimétricas y aislamientos lógicos (Topological Pruning) de manera vectorizada, manipulando el grafo computacional de PyTorch directamente sobre sus índices dispersos (COO) para confinar el coste asintótico al subgrafo afectado.
Las operaciones expuestas son no destructivas: siempre retornan una nueva
:class:~iobsolve.core.space.DiscreteTopology sin modificar la instancia
original. El motor utiliza clonado lazy en matrices densas y operaciones de
máscara booleana en matrices dispersas (COO), ambos en
:math:\mathcal{O}(k_i) para topologías ralas.
Operaciones disponibles
- :meth:
TopologicalSurgeon.isolate_vertices— Extirpa un conjunto de vértices anulando todas sus aristas entrantes y salientes. - :meth:
TopologicalSurgeon.prune_asymmetric_edges— Poda aristas direccionales específicas desde un nodo pivote hacia un subconjunto de nodos periféricos, manteniendo el resto de la conectividad intacto.
References
.. [1] Knuttzen, J. (2026). "Formalismo de Integridad de Bisagra Discreto". Sección 3.2: Cirugía Topológica y el Costo de Cicatrización.
TopologicalSurgeon ¶
Motor de Cirugía Algorítmica Local.
Orquesta las modificaciones estructurales de la matriz de adyacencia
dinámica :math:\mathcal{W}(t) en respuesta a colapsos detectados por el
D-IOB. Todas las operaciones son no destructivas: retornan siempre una
nueva instancia de :class:~iobsolve.core.space.DiscreteTopology.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
topology
|
DiscreteTopology
|
La variedad discreta :math: |
required |
Attributes:
| Name | Type | Description |
|---|---|---|
topology |
DiscreteTopology
|
Copia de trabajo interna de la topología. Inmutable desde fuera de la clase; cada operación de cirugía retorna una nueva instancia. |
Examples:
Aislar el nodo central de una topología estrella ante un ataque DDoS:
>>> import torch
>>> from iobsolve.core.space import DiscreteTopology
>>> from iobsolve.discrete.surgery import TopologicalSurgeon
>>> N = 10
>>> adj = torch.zeros((N, N), dtype=torch.float64)
>>> adj[0, 1:] = 1.0; adj[1:, 0] = 1.0
>>> topo = DiscreteTopology(adjacency=adj)
>>> surgeon = TopologicalSurgeon(topology=topo)
>>> new_topo = surgeon.isolate_vertices(torch.tensor([0]))
>>> float(new_topo.adjacency[0].sum())
0.0
Source code in iobsolve/discrete/surgery.py
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 | |
isolate_vertices ¶
Ejecuta la extirpación topológica de los vértices anómalos.
Fuerza analíticamente :math:w_{ij}(t^+) = 0 para todo
:math:j \in \mathcal{N}(i), desconectando completamente a la
singularidad del resto de la malla (aislamiento completo de fila y
columna en la matriz de adyacencia).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
singular_indices
|
Tensor
|
Vector de índices (1-D, |
required |
Returns:
| Type | Description |
|---|---|
DiscreteTopology
|
Nueva variedad topológica con la cicatrización efectuada. |
Complexity
:math:\mathcal{O}(k_i) en matrices dispersas (Sparse COO), ya que
aplica máscaras booleanas exclusivamente sobre las coordenadas activas,
evitando una iteración densa sobre :math:V^2.
:math:\mathcal{O}(|V|^2) en matrices densas (coste del slicing
adj[indices, :] = 0).
Notes
En formato denso, la operación es un slice-assign en fila y columna.
En formato Sparse COO, se aplica una máscara booleana sobre
adj.indices() filtrando todas las aristas donde aparezca algún
índice singular como fuente o destino.
Source code in iobsolve/discrete/surgery.py
prune_asymmetric_edges ¶
Poda aristas direccionales específicas sin aislar el nodo pivote.
Útil para mitigar vectores de estrés asimétricos (p.ej., ataques DDoS selectivos) manteniendo intacto el servicio legítimo periférico del nodo comprometido.
La operación anula las aristas :math:(s, t_j) y :math:(t_j, s)
para todo :math:t_j \in \texttt{target\_indices}, pero preserva
las conexiones de :math:s con el resto de la vecindad.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
source_index
|
int
|
Índice del nodo central o pivote (server). |
required |
target_indices
|
Tensor
|
Índices de los nodos periféricos (clients) cuya conexión será podada (corte bidireccional). |
required |
Returns:
| Type | Description |
|---|---|
DiscreteTopology
|
La variedad resultante de la poda selectiva. |
Complexity
:math:\mathcal{O}(k_s) en matrices dispersas, donde :math:k_s es
el grado del nodo fuente. :math:\mathcal{O}(|E|) en el peor caso
densamente conectado.