summaryrefslogtreecommitdiff
path: root/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/product.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/product.py')
-rw-r--r--lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/product.py330
1 files changed, 0 insertions, 330 deletions
diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/product.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/product.py
deleted file mode 100644
index 0fa8a17..0000000
--- a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/operators/product.py
+++ /dev/null
@@ -1,330 +0,0 @@
-"""
-Graph products.
-"""
-# Copyright (C) 2011 by
-# Aric Hagberg <hagberg@lanl.gov>
-# Dan Schult <dschult@colgate.edu>
-# Pieter Swart <swart@lanl.gov>
-# All rights reserved.
-# BSD license.
-import networkx as nx
-from itertools import product
-
-__author__ = """\n""".join(['Aric Hagberg (hagberg@lanl.gov)',
- 'Pieter Swart (swart@lanl.gov)',
- 'Dan Schult(dschult@colgate.edu)'
- 'Ben Edwards(bedwards@cs.unm.edu)'])
-
-__all__ = ['tensor_product','cartesian_product',
- 'lexicographic_product', 'strong_product']
-
-def _dict_product(d1,d2):
- return dict((k,(d1.get(k),d2.get(k))) for k in set(d1)|set(d2))
-
-
-# Generators for producting graph products
-def _node_product(G,H):
- for u,v in product(G, H):
- yield ((u,v), _dict_product(G.node[u], H.node[v]))
-
-def _directed_edges_cross_edges(G,H):
- if not G.is_multigraph() and not H.is_multigraph():
- for u,v,c in G.edges_iter(data=True):
- for x,y,d in H.edges_iter(data=True):
- yield (u,x),(v,y),_dict_product(c,d)
- if not G.is_multigraph() and H.is_multigraph():
- for u,v,c in G.edges_iter(data=True):
- for x,y,k,d in H.edges_iter(data=True,keys=True):
- yield (u,x),(v,y),k,_dict_product(c,d)
- if G.is_multigraph() and not H.is_multigraph():
- for u,v,k,c in G.edges_iter(data=True,keys=True):
- for x,y,d in H.edges_iter(data=True):
- yield (u,x),(v,y),k,_dict_product(c,d)
- if G.is_multigraph() and H.is_multigraph():
- for u,v,j,c in G.edges_iter(data=True,keys=True):
- for x,y,k,d in H.edges_iter(data=True,keys=True):
- yield (u,x),(v,y),(j,k),_dict_product(c,d)
-
-def _undirected_edges_cross_edges(G,H):
- if not G.is_multigraph() and not H.is_multigraph():
- for u,v,c in G.edges_iter(data=True):
- for x,y,d in H.edges_iter(data=True):
- yield (v,x),(u,y),_dict_product(c,d)
- if not G.is_multigraph() and H.is_multigraph():
- for u,v,c in G.edges_iter(data=True):
- for x,y,k,d in H.edges_iter(data=True,keys=True):
- yield (v,x),(u,y),k,_dict_product(c,d)
- if G.is_multigraph() and not H.is_multigraph():
- for u,v,k,c in G.edges_iter(data=True,keys=True):
- for x,y,d in H.edges_iter(data=True):
- yield (v,x),(u,y),k,_dict_product(c,d)
- if G.is_multigraph() and H.is_multigraph():
- for u,v,j,c in G.edges_iter(data=True,keys=True):
- for x,y,k,d in H.edges_iter(data=True,keys=True):
- yield (v,x),(u,y),(j,k),_dict_product(c,d)
-
-def _edges_cross_nodes(G,H):
- if G.is_multigraph():
- for u,v,k,d in G.edges_iter(data=True,keys=True):
- for x in H:
- yield (u,x),(v,x),k,d
- else:
- for u,v,d in G.edges_iter(data=True):
- for x in H:
- if H.is_multigraph():
- yield (u,x),(v,x),None,d
- else:
- yield (u,x),(v,x),d
-
-
-def _nodes_cross_edges(G,H):
- if H.is_multigraph():
- for x in G:
- for u,v,k,d in H.edges_iter(data=True,keys=True):
- yield (x,u),(x,v),k,d
- else:
- for x in G:
- for u,v,d in H.edges_iter(data=True):
- if G.is_multigraph():
- yield (x,u),(x,v),None,d
- else:
- yield (x,u),(x,v),d
-
-def _edges_cross_nodes_and_nodes(G,H):
- if G.is_multigraph():
- for u,v,k,d in G.edges_iter(data=True,keys=True):
- for x in H:
- for y in H:
- yield (u,x),(v,y),k,d
- else:
- for u,v,d in G.edges_iter(data=True):
- for x in H:
- for y in H:
- if H.is_multigraph():
- yield (u,x),(v,y),None,d
- else:
- yield (u,x),(v,y),d
-
-def _init_product_graph(G,H):
- if not G.is_directed() == H.is_directed():
- raise nx.NetworkXError("G and H must be both directed or",
- "both undirected")
- if G.is_multigraph() or H.is_multigraph():
- GH = nx.MultiGraph()
- else:
- GH = nx.Graph()
- if G.is_directed():
- GH = GH.to_directed()
- return GH
-
-
-def tensor_product(G,H):
- r"""Return the tensor product of G and H.
-
- The tensor product P of the graphs G and H has a node set that
- is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$.
- P has an edge ((u,v),(x,y)) if and only if (u,v) is an edge in G
- and (x,y) is an edge in H.
-
- Sometimes referred to as the categorical product.
-
-
- Parameters
- ----------
- G, H: graphs
- Networkx graphs.
-
- Returns
- -------
- P: NetworkX graph
- The tensor product of G and H. P will be a multi-graph if either G
- or H is a multi-graph. Will be a directed if G and H are directed,
- and undirected if G and H are undirected.
-
- Raises
- ------
- NetworkXError
- If G and H are not both directed or both undirected.
-
- Notes
- -----
- Node attributes in P are two-tuple of the G and H node attributes.
- Missing attributes are assigned None.
-
- For example
- >>> G = nx.Graph()
- >>> H = nx.Graph()
- >>> G.add_node(0,a1=True)
- >>> H.add_node('a',a2='Spam')
- >>> P = nx.tensor_product(G,H)
- >>> P.nodes()
- [(0, 'a')]
-
- Edge attributes and edge keys (for multigraphs) are also copied to the
- new product graph
- """
- GH = _init_product_graph(G,H)
- GH.add_nodes_from(_node_product(G,H))
- GH.add_edges_from(_directed_edges_cross_edges(G,H))
- if not GH.is_directed():
- GH.add_edges_from(_undirected_edges_cross_edges(G,H))
- GH.name = "Tensor product("+G.name+","+H.name+")"
- return GH
-
-def cartesian_product(G,H):
- """Return the Cartesian product of G and H.
-
- The tensor product P of the graphs G and H has a node set that
- is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$.
- P has an edge ((u,v),(x,y)) if and only if (u,v) is an edge in G
- and x==y or and (x,y) is an edge in H and u==v.
- and (x,y) is an edge in H.
-
- Parameters
- ----------
- G, H: graphs
- Networkx graphs.
-
- Returns
- -------
- P: NetworkX graph
- The Cartesian product of G and H. P will be a multi-graph if either G
- or H is a multi-graph. Will be a directed if G and H are directed,
- and undirected if G and H are undirected.
-
- Raises
- ------
- NetworkXError
- If G and H are not both directed or both undirected.
-
- Notes
- -----
- Node attributes in P are two-tuple of the G and H node attributes.
- Missing attributes are assigned None.
-
- For example
- >>> G = nx.Graph()
- >>> H = nx.Graph()
- >>> G.add_node(0,a1=True)
- >>> H.add_node('a',a2='Spam')
- >>> P = nx.cartesian_product(G,H)
- >>> P.nodes()
- [(0, 'a')]
-
- Edge attributes and edge keys (for multigraphs) are also copied to the
- new product graph
- """
- if not G.is_directed() == H.is_directed():
- raise nx.NetworkXError("G and H must be both directed or",
- "both undirected")
- GH = _init_product_graph(G,H)
- GH.add_nodes_from(_node_product(G,H))
- GH.add_edges_from(_edges_cross_nodes(G,H))
- GH.add_edges_from(_nodes_cross_edges(G,H))
- GH.name = "Cartesian product("+G.name+","+H.name+")"
- return GH
-
-def lexicographic_product(G,H):
- """Return the lexicographic product of G and H.
-
- The lexicographical product P of the graphs G and H has a node set that
- is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$.
- P has an edge ((u,v),(x,y)) if and only if (u,v) is an edge in G
- or u==v and (x,y) is an edge in H.
-
- Parameters
- ----------
- G, H: graphs
- Networkx graphs.
-
- Returns
- -------
- P: NetworkX graph
- The Cartesian product of G and H. P will be a multi-graph if either G
- or H is a multi-graph. Will be a directed if G and H are directed,
- and undirected if G and H are undirected.
-
- Raises
- ------
- NetworkXError
- If G and H are not both directed or both undirected.
-
- Notes
- -----
- Node attributes in P are two-tuple of the G and H node attributes.
- Missing attributes are assigned None.
-
- For example
- >>> G = nx.Graph()
- >>> H = nx.Graph()
- >>> G.add_node(0,a1=True)
- >>> H.add_node('a',a2='Spam')
- >>> P = nx.lexicographic_product(G,H)
- >>> P.nodes()
- [(0, 'a')]
-
- Edge attributes and edge keys (for multigraphs) are also copied to the
- new product graph
- """
- GH = _init_product_graph(G,H)
- GH.add_nodes_from(_node_product(G,H))
- # Edges in G regardless of H designation
- GH.add_edges_from(_edges_cross_nodes_and_nodes(G,H))
- # For each x in G, only if there is an edge in H
- GH.add_edges_from(_nodes_cross_edges(G,H))
- GH.name = "Lexicographic product("+G.name+","+H.name+")"
- return GH
-
-def strong_product(G,H):
- """Return the strong product of G and H.
-
- The strong product P of the graphs G and H has a node set that
- is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$.
- P has an edge ((u,v),(x,y)) if and only if
- u==v and (x,y) is an edge in H, or
- x==y and (u,v) is an edge in G, or
- (u,v) is an edge in G and (x,y) is an edge in H.
-
- Parameters
- ----------
- G, H: graphs
- Networkx graphs.
-
- Returns
- -------
- P: NetworkX graph
- The Cartesian product of G and H. P will be a multi-graph if either G
- or H is a multi-graph. Will be a directed if G and H are directed,
- and undirected if G and H are undirected.
-
- Raises
- ------
- NetworkXError
- If G and H are not both directed or both undirected.
-
- Notes
- -----
- Node attributes in P are two-tuple of the G and H node attributes.
- Missing attributes are assigned None.
-
- For example
- >>> G = nx.Graph()
- >>> H = nx.Graph()
- >>> G.add_node(0,a1=True)
- >>> H.add_node('a',a2='Spam')
- >>> P = nx.strong_product(G,H)
- >>> P.nodes()
- [(0, 'a')]
-
- Edge attributes and edge keys (for multigraphs) are also copied to the
- new product graph
- """
- GH = _init_product_graph(G,H)
- GH.add_nodes_from(_node_product(G,H))
- GH.add_edges_from(_nodes_cross_edges(G,H))
- GH.add_edges_from(_edges_cross_nodes(G,H))
- GH.add_edges_from(_directed_edges_cross_edges(G,H))
- if not GH.is_directed():
- GH.add_edges_from(_undirected_edges_cross_edges(G,H))
- GH.name = "Strong product("+G.name+","+H.name+")"
- return GH