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