[pyar] Sobre grafos, nodos y objetos

Alejandro Santos listas en alejolp.com
Lun Nov 8 22:52:52 ART 2010


On Mon, Nov 8, 2010 at 12:13 PM, Jose Jachuf <jjachuf en gmail.com> wrote:
> Tordek,
>
> ya entendí lo que me dijiste, en el mail anterior me parece que
> respondí cualquiera.
>
> Lo que me confunde es lo siguiente, según la documentación de networkx
> para add_edge [1] si el nodo ya existe (basado en el __hash__),  no lo
> agrega, por el contrario, si no existe, lo agrega.
>
> * The nodes u and v will be automatically added if they are not
> already in the graph.
> * Nodes must be hashable (and not None) Python objects.
>

Si mirás el codigo fuente de la funcion add_edge()[0] vas a ver que,
como bien dijiste, pregunta si el nodo ya existe. Si no existe lo
agrega, sino no hace nada.

Pero... dos nodos con diferente identidad id() pueden ser iguales,
gracias a __eq__. Cuando se agrega un segundo edge que tiene un nodo
que ya existe, en una de las puntas accede por el nodo viejo, y en la
otra punta del edge usa la instancia del nodo que le llega por
parametro... o sea, un nodo con diferente id().

El bug es muy sutil, pero si seguis el codigo de add_edge lo vas a
poder ver mas claro.

En la funcion "_agregar_nodos_simples", en vez de crear varios
NodoSimple deberias mantener un dict() local con instancias ya
existentes de nodos.

[0] https://networkx.lanl.gov/trac/browser/networkx/networkx/classes/graph.py#L710

-- 
Alejandro Santos
http://alejolp.com.ar



More information about the pyar mailing list