# generate all (not necessarily induced) subgraphs of a graph

I want to, given a Sage graph G, generate all subgraphs of G and check them for some property, and store in a list those which satisfy the propery. What I'm doing currently seems very inefficient:

graphs_i_want=[]
for g in graphs.nauty_geng(str(G.order())):
if G.subgraph_search(g):
if check(g):
graphs_i_want.append(g.graph6_string())


check(g) checks that g satisfies the properties I want, and it's done. Actually the code above works completely - it gives a list of the graph6 strings for every subgraph of G. However, I think it's overkill to check through all graphs, and it's also pretty slow for graphs larger than 6 vertices or so. I need it to work for more, up to maybe 15.

An iterator would be fine. I just need to check each of the graphs for some property. The code could be something like this:

graphs_i_want=[]
for g in all_subsets_generator(G):
if check(g):
graphs_i_want.append(g.graph6_string())


where all_subsets_generator(G) iterates over all subsets of G.

edit retag close merge delete

Sort by » oldest newest most voted

You could try the following

E=Set(G.edges())
V=G.vertices()
for s in E.subsets():
H=Graph()
#If you are interested only in spanning subgraphs you have to include this line
if check( H ):
graphs_you_want.append( H.graph6_string() )


One thing to keep in mind is that you might want to get the canonical label of H into the list of graphs you want (in case you are interested in non labelled subgraphs). This could help avoid duplicates (isomorphic graphs) in the list.

This does not guarantee it will be faster, it will take the same time (maybe more) as your first approach when G is the complete graph.

more

thanks, this is what I want. my graphs are relatively sparse, so I think it should be faster. I didn't know much about .edges() or .add_edges(), those are quite useful. to handle the isomorphic graphs, I added just before appending graphs which pass check() the following: H_can=H.canonical_label(), then graphs_you_want.append( H_can.graph6_string() ) to append. after it runs, list(set(graphs_you_want)) removes duplicates (and is fairly fast because the list is short). thanks again~

( 2013-04-17 04:51:29 -0600 )edit