Sorry to bother again. I am not sure how python build-in methods "sorted"
and "reversed" work on vertex descriptor list. The following code snippet
output:
vertex 3
vertex 5
vertex 1
code snippet:
del_list = [g.vertex(1), g.vertex(5), g.vertex(3)]
for v in reversed(sorted(del_list)):
print 'vertex', int(v)
Is it correct? I am using debian wheezy, and install graph-tool by adding
"deb http://downloads.skewed.de/apt/wheezy wheezy main " in my source
list. Although I know there only lists "jessie" and "sid",
I still got graph-tool successfully installed and everything seems work well.
2015-04-20 23:36 GMT+08:00 Tiago de Paula Peixoto <[email protected]>:
> On 20.04.2015 18:19, Bo Wu wrote:
> > Hi all,
> >
> > I found something weird in deleting vertices and edges of a graph. Say I
> simply create a graph like:
> >
> > g = Graph(directed=False)
> > g.add_vertex(7)
> > g.add_edge(g.vertex(0), g.vertex(1))
> > g.add_edge(g.vertex(1), g.vertex(2))
> > g.add_edge(g.vertex(2), g.vertex(3))
> > g.add_edge(g.vertex(3), g.vertex(4))
> > g.add_edge(g.vertex(2), g.vertex(5))
> > g.add_edge(g.vertex(5), g.vertex(6))
> >
> > del_list = [g.vertex(1), g.vertex(3)]
> >
> > for v in reversed(sorted(del_list)):
> > print 'deleting vertex', int(v)
> > ## for ve in v.out_edges():
> > ## print 'deleting edges', ve.source(), ve.target()
> > ## g.remove_edge(ve)
> > g.remove_vertex(v, fast=True)
> >
> > The above code will delete vertex 3 first, then vertex 1 as expected.
> However, in order to keep correct topology, we should delete some related
> edges first, like the three commented lines (start with "##").
> >
> > But if you uncomment the three lines, weird thing happens: the program
> will delete vertex 1 first, then vertex 3.
> >
> > Of course I can sort the vertex index instead of vertex descriptor to
> avoid the problem. But I am wondering where is wrong. Could anyone explain
> this?
>
> I don't observe anything weird. Here I see the following with the lines
> uncommented:
>
> deleting vertex 3
> deleting edges 3 2
> deleting edges 3 4
> deleting vertex 1
> deleting edges 1 0
> deleting edges 1 2
>
> First vertex 3, then 1.
>
> However there is indeed a problem with your code. In the documentation:
>
>
> https://graph-tool.skewed.de/static/doc/quickstart.html#iterating-over-the-neighbourhood-of-a-vertex
>
> there is this following warning:
>
> You should never remove vertex or edge descriptors when iterating
> over them, since this invalidates the iterators. If you plan to
> remove vertices or edges during iteration, you must first store them
> somewhere (such as in a list) and remove them only after no iterator
> is being used. Removal during iteration will cause bad things to
> happen.
>
> This is what you are trying to do if you uncomment the lines, and it
> might cause problems. Don't do that; store the edges in a list first.
>
> Best,
> Tiago
>
> --
> Tiago de Paula Peixoto <[email protected]>
>
>
> _______________________________________________
> graph-tool mailing list
> [email protected]
> http://lists.skewed.de/mailman/listinfo/graph-tool
>
>
--
Cheers,
Bo Wu
_______________________________________________
graph-tool mailing list
[email protected]
http://lists.skewed.de/mailman/listinfo/graph-tool