Hey,
I'm struggeling with the grap_union() function. It seems like the properties are only correctly passed to the union graph, if include=True. Is this how it supposed to work? Here a minimal example:
import graph_tool.all as gt import graph_tool.topology as gt_topo from gi.repository import Gtk, Gdk, GdkPixbuf, GObject
G = gt.Graph(directed=False) G_sub = gt.Graph(directed=False)
v1 = G.add_vertex() v2 = G.add_vertex() v3 = G.add_vertex()
v4 = G_sub.add_vertex() v5 = G_sub.add_vertex()
e1 = G.add_edge(v2, v1) e2 = G.add_edge(v2, v3)
e3 = G_sub.add_edge(v5, v4)
G.vertex_properties['type'] = G.new_vertex_property("string")
G_sub.vertex_properties['type'] = G_sub.new_vertex_property("string")
G.vertex_properties['type'][v1] = 'Car' G.vertex_properties['type'][v2] = 'Crossing' G.vertex_properties['type'][v3] = 'Car'
G_sub.vertex_properties['type'][v4] = 'Pedestrian' G_sub.vertex_properties['type'][v5] = 'Sidewalk'
#ToDo: Function bug, why is include=True needed? G_union, prop = gt.graph_union(G, G_sub, props=[(G.vertex_properties['type'], \ G_sub.vertex_properties['type'])], include=True)
pos = gt.sfdp_layout(G) gt.graph_draw(G_union, pos, vertex_text=G_union.vertex_properties['type'])
Another point that I find a bit not so intuitive is that you have to specify every single property of the two graphs you would like to have in the new graph, wouldn't it be much more intuitive to copy all the properties into the new graph unless not told otherwise?
P.S: This will probably not my last question as I'm planning to heavily use graph-tool for my research....
On 02/20/2014 09:03 AM, Stefan Klingelschmitt wrote:
Hey,
I'm struggeling with the grap_union() function. It seems like the properties are only correctly passed to the union graph, if include=True. Is this how it supposed to work? Here a minimal example:
import graph_tool.all as gt import graph_tool.topology as gt_topo from gi.repository import Gtk, Gdk, GdkPixbuf, GObject
G = gt.Graph(directed=False) G_sub = gt.Graph(directed=False)
v1 = G.add_vertex() v2 = G.add_vertex() v3 = G.add_vertex()
v4 = G_sub.add_vertex() v5 = G_sub.add_vertex()
e1 = G.add_edge(v2, v1) e2 = G.add_edge(v2, v3)
e3 = G_sub.add_edge(v5, v4)
G.vertex_properties['type'] = G.new_vertex_property("string")
G_sub.vertex_properties['type'] = G_sub.new_vertex_property("string")
G.vertex_properties['type'][v1] = 'Car' G.vertex_properties['type'][v2] = 'Crossing' G.vertex_properties['type'][v3] = 'Car'
G_sub.vertex_properties['type'][v4] = 'Pedestrian' G_sub.vertex_properties['type'][v5] = 'Sidewalk'
#ToDo: Function bug, why is include=True needed? G_union, prop = gt.graph_union(G, G_sub, props=[(G.vertex_properties['type'], \ G_sub.vertex_properties['type'])], include=True)
pos = gt.sfdp_layout(G) gt.graph_draw(G_union, pos, vertex_text=G_union.vertex_properties['type'])
No, include = True is not needed. The collected properties are always returned via the "prop" variable, which you are ignoring. You should use prop[0] as the parameter to vertex_text in graph_draw(), to see the correct behavior. The union graph never contains internal properties (unless include == True), as you seem to be expecting.
Another point that I find a bit not so intuitive is that you have to specify every single property of the two graphs you would like to have in the new graph, wouldn't it be much more intuitive to copy all the properties into the new graph unless not told otherwise?
The graph_union() functions ignores the existence of internal properties for simplicity, and only considers explicitly given ones. The reason for this is that that may be cases where internal properties have the same name but have different and nonconvertible types. In this case, which could occur rather often, the union would fail.
However, with the current function, I agree that it is actually somewhat cumbersome to perform an union of graphs with many internal properties, which may be desired. I think it would make sense to include this as an option... I'll try to get around to improving this in the next release. (You could open a ticket in the website, to make sure I don't forget).
Best, Tiago
Thanks for your answer and sorry for my belated reply... vacation...
Your right I was ignoring the prop return.
I would be really nice to have the option to not have to incorporate every property by hand. This becomes espacially handy if not all nodes have in fact the same properties. Because in this case incorporating every property by hand is not possible....
On 03/20/2014 01:09 PM, Stefan Klingelschmitt wrote:
Thanks for your answer and sorry for my belated reply... vacation...
Your right I was ignoring the prop return.
I would be really nice to have the option to not have to incorporate every property by hand. This becomes espacially handy if not all nodes have in fact the same properties. Because in this case incorporating every property by hand is not possible....
I think you are right. Could you please open a ticket for this in the website, so I don't forget about this?
Best, Tiago