Python networkx.chordal_graph_cliques() Examples
The following are 18
code examples of networkx.chordal_graph_cliques().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
networkx
, or try the search function
.
Example #1
Source File: graph_utils.py From metal with Apache License 2.0 | 6 votes |
def get_clique_tree(nodes, edges): """Given a set of int nodes i and edges (i,j), returns an nx.Graph object G which is a clique tree, where: - G.node[i]['members'] contains the set of original nodes in the ith maximal clique - G[i][j]['members'] contains the set of original nodes in the seperator set between maximal cliques i and j Note: This method is currently only implemented for chordal graphs; TODO: add a step to triangulate non-chordal graphs. """ # Form the original graph G1 G1 = nx.Graph() G1.add_nodes_from(nodes) G1.add_edges_from(edges) # Check if graph is chordal # TODO: Add step to triangulate graph if not if not nx.is_chordal(G1): raise NotImplementedError("Graph triangulation not implemented.") # Create maximal clique graph G2 # Each node is a maximal clique C_i # Let w = |C_i \cap C_j|; C_i, C_j have an edge with weight w if w > 0 G2 = nx.Graph() for i, c in enumerate(nx.chordal_graph_cliques(G1)): G2.add_node(i, members=c) for i in G2.nodes: for j in G2.nodes: S = G2.node[i]["members"].intersection(G2.node[j]["members"]) w = len(S) if w > 0: G2.add_edge(i, j, weight=w, members=S) # Return a minimum spanning tree of G2 return nx.minimum_spanning_tree(G2)
Example #2
Source File: chordal_alg.py From qgisSpaceSyntaxToolkit with GNU General Public License v3.0 | 5 votes |
def chordal_graph_cliques(G): """Returns the set of maximal cliques of a chordal graph. The algorithm breaks the graph in connected components and performs a maximum cardinality search in each component to get the cliques. Parameters ---------- G : graph A NetworkX graph Returns ------- cliques : A set containing the maximal cliques in G. Raises ------ NetworkXError The algorithm does not support DiGraph, MultiGraph and MultiDiGraph. If the input graph is an instance of one of these classes, a NetworkXError is raised. The algorithm can only be applied to chordal graphs. If the input graph is found to be non-chordal, a NetworkXError is raised. Examples -------- >>> import networkx as nx >>> e= [(1,2),(1,3),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6),(5,6),(7,8)] >>> G = nx.Graph(e) >>> G.add_node(9) >>> setlist = nx.chordal_graph_cliques(G) """ if not is_chordal(G): raise nx.NetworkXError("Input graph is not chordal.") cliques = set() for C in nx.connected.connected_component_subgraphs(G): cliques |= _connected_chordal_graph_cliques(C) return cliques
Example #3
Source File: chordal.py From aws-kube-codesuite with Apache License 2.0 | 5 votes |
def chordal_graph_cliques(G): """Returns the set of maximal cliques of a chordal graph. The algorithm breaks the graph in connected components and performs a maximum cardinality search in each component to get the cliques. Parameters ---------- G : graph A NetworkX graph Returns ------- cliques : A set containing the maximal cliques in G. Raises ------ NetworkXError The algorithm does not support DiGraph, MultiGraph and MultiDiGraph. If the input graph is an instance of one of these classes, a :exc:`NetworkXError` is raised. The algorithm can only be applied to chordal graphs. If the input graph is found to be non-chordal, a :exc:`NetworkXError` is raised. Examples -------- >>> import networkx as nx >>> e= [(1,2),(1,3),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6),(5,6),(7,8)] >>> G = nx.Graph(e) >>> G.add_node(9) >>> setlist = nx.chordal_graph_cliques(G) """ if not is_chordal(G): raise nx.NetworkXError("Input graph is not chordal.") cliques = set() for C in nx.connected.connected_component_subgraphs(G): cliques |= _connected_chordal_graph_cliques(C) return cliques
Example #4
Source File: test_chordal.py From qgisSpaceSyntaxToolkit with GNU General Public License v3.0 | 5 votes |
def test_chordal_find_cliques(self): cliques = set([frozenset([9]),frozenset([7,8]),frozenset([1,2,3]), frozenset([2,3,4]),frozenset([3,4,5,6])]) assert_equal(nx.chordal_graph_cliques(self.chordal_G),cliques)
Example #5
Source File: test_chordal.py From qgisSpaceSyntaxToolkit with GNU General Public License v3.0 | 5 votes |
def test_chordal_find_cliques_path(self): G = nx.path_graph(10) cliqueset = nx.chordal_graph_cliques(G) for (u,v) in G.edges_iter(): assert_true(frozenset([u,v]) in cliqueset or frozenset([v,u]) in cliqueset)
Example #6
Source File: test_chordal.py From qgisSpaceSyntaxToolkit with GNU General Public License v3.0 | 5 votes |
def test_chordal_find_cliquesCC(self): cliques = set([frozenset([1,2,3]),frozenset([2,3,4]), frozenset([3,4,5,6])]) assert_equal(nx.chordal_graph_cliques(self.connected_chordal_G),cliques)
Example #7
Source File: test_chordal.py From aws-kube-codesuite with Apache License 2.0 | 5 votes |
def test_chordal_find_cliquesCC(self): cliques = set([frozenset([1, 2, 3]), frozenset([2, 3, 4]), frozenset([3, 4, 5, 6])]) assert_equal(nx.chordal_graph_cliques(self.connected_chordal_G), cliques)
Example #8
Source File: test_chordal.py From Carnets with BSD 3-Clause "New" or "Revised" License | 5 votes |
def test_chordal_find_cliques(self): cliques = set([frozenset([9]), frozenset([7, 8]), frozenset([1, 2, 3]), frozenset([2, 3, 4]), frozenset([3, 4, 5, 6])]) assert_equal(nx.chordal_graph_cliques(self.chordal_G), cliques)
Example #9
Source File: test_chordal.py From Carnets with BSD 3-Clause "New" or "Revised" License | 5 votes |
def test_chordal_find_cliques_path(self): G = nx.path_graph(10) cliqueset = nx.chordal_graph_cliques(G) for (u, v) in G.edges(): assert_true(frozenset([u, v]) in cliqueset or frozenset([v, u]) in cliqueset)
Example #10
Source File: test_chordal.py From Carnets with BSD 3-Clause "New" or "Revised" License | 5 votes |
def test_chordal_find_cliquesCC(self): cliques = set([frozenset([1, 2, 3]), frozenset([2, 3, 4]), frozenset([3, 4, 5, 6])]) assert_equal(nx.chordal_graph_cliques(self.connected_chordal_G), cliques)
Example #11
Source File: chordal.py From Carnets with BSD 3-Clause "New" or "Revised" License | 5 votes |
def chordal_graph_cliques(G): """Returns the set of maximal cliques of a chordal graph. The algorithm breaks the graph in connected components and performs a maximum cardinality search in each component to get the cliques. Parameters ---------- G : graph A NetworkX graph Returns ------- cliques : A set containing the maximal cliques in G. Raises ------ NetworkXError The algorithm does not support DiGraph, MultiGraph and MultiDiGraph. If the input graph is an instance of one of these classes, a :exc:`NetworkXError` is raised. The algorithm can only be applied to chordal graphs. If the input graph is found to be non-chordal, a :exc:`NetworkXError` is raised. Examples -------- >>> import networkx as nx >>> e= [(1,2),(1,3),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6),(5,6),(7,8)] >>> G = nx.Graph(e) >>> G.add_node(9) >>> setlist = nx.chordal_graph_cliques(G) """ if not is_chordal(G): raise nx.NetworkXError("Input graph is not chordal.") cliques = set() for C in nx.connected.connected_component_subgraphs(G): cliques |= _connected_chordal_graph_cliques(C) return cliques
Example #12
Source File: test_chordal.py From aws-kube-codesuite with Apache License 2.0 | 5 votes |
def test_chordal_find_cliques_path(self): G = nx.path_graph(10) cliqueset = nx.chordal_graph_cliques(G) for (u, v) in G.edges(): assert_true(frozenset([u, v]) in cliqueset or frozenset([v, u]) in cliqueset)
Example #13
Source File: test_chordal.py From aws-kube-codesuite with Apache License 2.0 | 5 votes |
def test_chordal_find_cliques(self): cliques = set([frozenset([9]), frozenset([7, 8]), frozenset([1, 2, 3]), frozenset([2, 3, 4]), frozenset([3, 4, 5, 6])]) assert_equal(nx.chordal_graph_cliques(self.chordal_G), cliques)
Example #14
Source File: chordal.py From aws-kube-codesuite with Apache License 2.0 | 4 votes |
def chordal_graph_treewidth(G): """Returns the treewidth of the chordal graph G. Parameters ---------- G : graph A NetworkX graph Returns ------- treewidth : int The size of the largest clique in the graph minus one. Raises ------ NetworkXError The algorithm does not support DiGraph, MultiGraph and MultiDiGraph. If the input graph is an instance of one of these classes, a :exc:`NetworkXError` is raised. The algorithm can only be applied to chordal graphs. If the input graph is found to be non-chordal, a :exc:`NetworkXError` is raised. Examples -------- >>> import networkx as nx >>> e = [(1,2),(1,3),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6),(5,6),(7,8)] >>> G = nx.Graph(e) >>> G.add_node(9) >>> nx.chordal_graph_treewidth(G) 3 References ---------- .. [1] https://en.wikipedia.org/wiki/Tree_decomposition#Treewidth """ if not is_chordal(G): raise nx.NetworkXError("Input graph is not chordal.") max_clique = -1 for clique in nx.chordal_graph_cliques(G): max_clique = max(max_clique, len(clique)) return max_clique - 1
Example #15
Source File: chordal.py From Carnets with BSD 3-Clause "New" or "Revised" License | 4 votes |
def chordal_graph_treewidth(G): """Returns the treewidth of the chordal graph G. Parameters ---------- G : graph A NetworkX graph Returns ------- treewidth : int The size of the largest clique in the graph minus one. Raises ------ NetworkXError The algorithm does not support DiGraph, MultiGraph and MultiDiGraph. If the input graph is an instance of one of these classes, a :exc:`NetworkXError` is raised. The algorithm can only be applied to chordal graphs. If the input graph is found to be non-chordal, a :exc:`NetworkXError` is raised. Examples -------- >>> import networkx as nx >>> e = [(1,2),(1,3),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6),(5,6),(7,8)] >>> G = nx.Graph(e) >>> G.add_node(9) >>> nx.chordal_graph_treewidth(G) 3 References ---------- .. [1] https://en.wikipedia.org/wiki/Tree_decomposition#Treewidth """ if not is_chordal(G): raise nx.NetworkXError("Input graph is not chordal.") max_clique = -1 for clique in nx.chordal_graph_cliques(G): max_clique = max(max_clique, len(clique)) return max_clique - 1
Example #16
Source File: cliquetree.py From pyBN with MIT License | 4 votes |
def initialize_tree(self): """ Initialize the structure of a clique tree, using the following steps: - Moralize graph (i.e. marry parents) - Triangulate graph (i.e. make graph chordal) - Get max cliques (i.e. community/clique detection) - Max spanning tree over sepset cardinality (i.e. create tree) """ ### MORALIZE GRAPH & MAKE IT CHORDAL ### chordal_G = make_chordal(self.bn) # must return a networkx object V = chordal_G.nodes() ### GET MAX CLIQUES FROM CHORDAL GRAPH ### C = {} # key = vertex, value = clique object max_cliques = reversed(list(nx.chordal_graph_cliques(chordal_G))) for v_idx,clique in enumerate(max_cliques): C[v_idx] = Clique(set(clique)) ### MAXIMUM SPANNING TREE OVER COMPLETE GRAPH TO MAKE A TREE ### weighted_edge_dict = dict([(c_idx,{}) for c_idx in range(len(C))]) for i in range(len(C)): for j in range(len(C)): if i!=j: intersect_cardinality = len(C[i].sepset(C[j])) weighted_edge_dict[i][j] = -1*intersect_cardinality mst_G = mst(weighted_edge_dict) ### SET V,E,C ### self.E = mst_G # dictionary self.V = mst_G.keys() # list self.C = C ### ASSIGN EACH FACTOR TO ONE CLIQUE ONLY ### v_a = dict([(rv, False) for rv in self.bn.nodes()]) for clique in self.C.values(): temp_scope = [] for var in v_a: if v_a[var] == False and set(self.bn.scope(var)).issubset(clique.scope): temp_scope.append(var) v_a[var] = True clique._F = Factorization(self.bn, temp_scope) ### COMPUTE INITIAL POTENTIAL FOR EACH FACTOR ### # - i.e. multiply all of its assigned factors together for i, clique in self.C.items(): if len(self.parents(i)) == 0: clique.is_ready = True clique.initialize_psi()
Example #17
Source File: chordal_alg.py From qgisSpaceSyntaxToolkit with GNU General Public License v3.0 | 4 votes |
def chordal_graph_treewidth(G): """Returns the treewidth of the chordal graph G. Parameters ---------- G : graph A NetworkX graph Returns ------- treewidth : int The size of the largest clique in the graph minus one. Raises ------ NetworkXError The algorithm does not support DiGraph, MultiGraph and MultiDiGraph. If the input graph is an instance of one of these classes, a NetworkXError is raised. The algorithm can only be applied to chordal graphs. If the input graph is found to be non-chordal, a NetworkXError is raised. Examples -------- >>> import networkx as nx >>> e = [(1,2),(1,3),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6),(5,6),(7,8)] >>> G = nx.Graph(e) >>> G.add_node(9) >>> nx.chordal_graph_treewidth(G) 3 References ---------- .. [1] http://en.wikipedia.org/wiki/Tree_decomposition#Treewidth """ if not is_chordal(G): raise nx.NetworkXError("Input graph is not chordal.") max_clique = -1 for clique in nx.chordal_graph_cliques(G): max_clique = max(max_clique,len(clique)) return max_clique - 1
Example #18
Source File: graph_utils.py From snorkel with Apache License 2.0 | 4 votes |
def get_clique_tree(nodes: Iterable[int], edges: List[Tuple[int, int]]) -> nx.Graph: """ Given a set of int nodes i and edges (i,j), returns a clique tree. Clique tree is an object G for which: - G.node[i]['members'] contains the set of original nodes in the ith maximal clique - G[i][j]['members'] contains the set of original nodes in the seperator set between maximal cliques i and j Note: This method is currently only implemented for chordal graphs; TODO: add a step to triangulate non-chordal graphs. Parameters ---------- nodes A list of nodes indices edges A list of tuples, where each tuple has indices for connected nodes Returns ------- networkx.Graph An object G representing clique tree """ # Form the original graph G1 G1 = nx.Graph() G1.add_nodes_from(nodes) G1.add_edges_from(edges) # Check if graph is chordal # TODO: Add step to triangulate graph if not if not nx.is_chordal(G1): raise NotImplementedError("Graph triangulation not implemented.") # Create maximal clique graph G2 # Each node is a maximal clique C_i # Let w = |C_i \cap C_j|; C_i, C_j have an edge with weight w if w > 0 G2 = nx.Graph() for i, c in enumerate(nx.chordal_graph_cliques(G1)): G2.add_node(i, members=c) for i in G2.nodes: for j in G2.nodes: S = G2.node[i]["members"].intersection(G2.node[j]["members"]) w = len(S) if w > 0: G2.add_edge(i, j, weight=w, members=S) # Return a minimum spanning tree of G2 return nx.minimum_spanning_tree(G2)