def test_maximal_cliques(self): """Test maximal_cliques.""" G = Graph() G.add_edge('b','c') G.add_edge('b','d') G.add_edge('b','e') G.add_edge('b','f') G.add_edge('b','a') G.add_edge('a','c') G.add_edge('a','d') G.add_edge('a','e') G.add_edge('c','d') G.add_edge('c','e') G.add_edge('c','f') G.add_edge('c','g') G.add_edge('d','e') G.add_edge('d','g') G.add_edge('e','g') G.add_edge('f','g') # A clique of 'a, b, c, d, e' and some other edges. nodes = G.nodes() S, H = pClique.convert_graph_connectivity_to_sparse(G, nodes) i = nodes.index('a') tQ = pClique.grasp(S, H, 1, 5, i) c = [nodes[i] for i in tQ] print c self.assertTrue(set(c) == set(['a', 'b', 'c', 'd', 'e']))
def _findCliques(self, alignGraph, readsFa): """ Find all mutually exclusive cliques within the graph, with decreased size. alignGraph - a graph, each node represent a read and each edge represents an alignment between two end points. Return a dictionary of clique indices and nodes. key = index of a clique value = nodes within a clique Cliques are ordered by their size descendingly: index up, size down Reads which are not included in any cliques will be added as cliques of size 1. """ uc = {} # To keep cliques found used = [] # nodes within any cliques ind = 0 # index of clique to discover deg = alignGraph.degree().items() # Sort tuples of (node, degree) by degree, descendingly deg.sort(key=lambda x: x[1], reverse=True) for d in deg: node = d[0] # node which has the largest degree in alignGraph if node not in alignGraph: continue # just get the immediate neighbors since we're looking for perfect # cliques subGraph = alignGraph.subgraph([node] + alignGraph.neighbors(node)) subNodes = subGraph.nodes() # Convert from networkx.Graph to a sparse matrix S, H = pClique.convert_graph_connectivity_to_sparse( subGraph, subNodes) # index of the 'node' in the sub-graph seed_i = subNodes.index(node) # Grasp a clique from subGraph, and return indices of clique nodes # setting gamma=0.8 means to find quasi-0.8-cliques! tQ = pClique.grasp(S, H, gamma=0.8, maxitr=5, given_starting_node=seed_i) if len(tQ) > 0: c = [subNodes[i] for i in tQ] # nodes in the clique uc[ind] = c # Add the clique to uc ind += 1 used += c # Add clique nodes to used # Remove clique nodes from alignGraph and continue alignGraph.remove_nodes_from(c) with FastaReader(readsFa) as reader: for r in reader: rid = r.name.split()[0] if rid not in used: uc[ind] = [rid] ind += 1 return uc
def _findCliques(self, alignGraph, readsFa): """ Find all mutually exclusive cliques within the graph, with decreased size. alignGraph - a graph, each node represent a read and each edge represents an alignment between two end points. Return a dictionary of clique indices and nodes. key = index of a clique value = nodes within a clique Cliques are ordered by their size descendingly: index up, size down Reads which are not included in any cliques will be added as cliques of size 1. """ uc = {} # To keep cliques found used = [] # nodes within any cliques ind = 0 # index of clique to discover deg = alignGraph.degree().items() # Sort tuples of (node, degree) by degree, descendingly deg.sort(key=lambda x:x[1], reverse=True) for d in deg: node = d[0] # node which has the largest degree in alignGraph if node not in alignGraph: continue # just get the immediate neighbors since we're looking for perfect # cliques subGraph = alignGraph.subgraph([node] + alignGraph.neighbors(node)) subNodes = subGraph.nodes() # Convert from networkx.Graph to a sparse matrix S, H = pClique.convert_graph_connectivity_to_sparse( subGraph, subNodes) # index of the 'node' in the sub-graph seed_i = subNodes.index(node) # Grasp a clique from subGraph, and return indices of clique nodes # setting gamma=0.8 means to find quasi-0.8-cliques! tQ = pClique.grasp(S, H, gamma=0.8, maxitr=5, given_starting_node=seed_i) if len(tQ) > 0: c = [subNodes[i] for i in tQ] # nodes in the clique uc[ind] = c # Add the clique to uc ind += 1 used += c # Add clique nodes to used # Remove clique nodes from alignGraph and continue alignGraph.remove_nodes_from(c) with FastaReader(readsFa) as reader: for r in reader: rid = r.name.split()[0] if rid not in used: uc[ind] = [rid] ind += 1 return uc