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?
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-n...
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
Thank you very much for the immediate reply ! I had read that warning, but forgot it at all when coding. I think I will never forget it from now on.
2015-04-20 23:36 GMT+08:00 Tiago de Paula Peixoto tiago@skewed.de:
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-n...
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 tiago@skewed.de
graph-tool mailing list graph-tool@skewed.de http://lists.skewed.de/mailman/listinfo/graph-tool
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 tiago@skewed.de:
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-n...
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 tiago@skewed.de
graph-tool mailing list graph-tool@skewed.de http://lists.skewed.de/mailman/listinfo/graph-tool
On 21.04.2015 06:40, Bo Wu wrote:
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.
Be careful, if you use "wheezy" you will install a _very old_ version of graph-tool! Newer versions do not compile in wheezy, so you must use jessie or sid!
What you are seeing is probably a bug from a long time ago that already got fixed...
Best, Tiago
OK. Got it. Thank you !
2015-04-21 21:44 GMT+08:00 Tiago de Paula Peixoto tiago@skewed.de:
On 21.04.2015 06:40, Bo Wu wrote:
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.
Be careful, if you use "wheezy" you will install a _very old_ version of graph-tool! Newer versions do not compile in wheezy, so you must use jessie or sid!
What you are seeing is probably a bug from a long time ago that already got fixed...
Best, Tiago
-- Tiago de Paula Peixoto tiago@skewed.de
graph-tool mailing list graph-tool@skewed.de http://lists.skewed.de/mailman/listinfo/graph-tool