2013/1/9 Sirius Fuenmayor <fuenmayor.sirius@gmail.com>
I get a 'Segmentation fault (core dumped)' error when I try to calculate the pseudo_diameter() of a GraphView object <class 'graph_tool.GraphView'>. I must convert the GraphView object to a Graph object <class 'graph_tool.Graph'> to perform this calculation? How do I make this conversion?
My detailed problem is:
I have a graph that is fragmented in several components and I want to calculate several measures on every component, so I must extract every component as a graph to be able to apply the different tools on it. To do this I use label_components() to create a vertex PropertyMap that label the components
vprop_comps, size_comps = gt.label_components(g)
from this Property Map (vprop_comps) I create one Boolean PropertyMap for every component, the Boolean Property Map for a component will have 1 for every vertex that belong to this component and 0 otherwise, finally I construct a GraphView object from the Boolean Property Map of a component, and then apply the different tools on this object. My code is:
# for all components for i in range(size_comps.size): # create a boolean property map vprop_component_i = g.new_vertex_property("bool") # explore the property map that label the components 'vprop_comps' for j in range(vprop_comps.a.size): # if vprop_comps sugest that vertex j is in component i if (vprop_comps.a[j] == i): # put 'true' in the property of vertex j in the property map of component i vprop_component_i[g.vertex(j)] = True # With the boolean property map constructed for component i I can create a # GraphView object representing component i: c_i = gt.GraphView(g, vfilt=vprop_component_i) # and apply the different measures on it: clust_c_i = gt.global_clustering(c_i)[0] length_c_i = gt.pseudo_diameter(c_i)[0]
Everything goes fine until I calculate the pseudo_diameter() of c_i, if I try to, I receive a 'Segmentation fault (core dumped)' error.
Is there a more direct way to extract the components as graph objects?
I don't know about the segfault (I encountered the same problem with a test graph), your approach uses too much code to select the components. I suggest the following: vprop_comps, size_comps = gt.label_components(g) for i in range(len(size_comps)): gv = gt.GraphView(g,vfilt=lambda x: vprop_comps[x]==i) Hope it helps, at least in having a cleaner code. Giuseppe