NetworkX

Previous topic

generic_multiedge_match

Next topic

could_be_isomorphic

is_isomorphic

is_isomorphic(G1, G2, node_match=None, edge_match=None)

Returns True if the graphs G1 and G2 are isomorphic and False otherwise.

Parameters :

G1, G2: NetworkX graph instances :

The two graphs G1 and G2 must be the same type.

node_match : callable

A function that returns True if node n1 in G1 and n2 in G2 should be considered equal during the isomorphism test. If None`, then no node attributes are considered when testing for isomorphism.

The function will be called like:

node_match(G1.node[n1], G2.node[n2]).

That is, the function will receive the node attribute dictionaries for n1 and n2.

edge_match : callable

A function that returns True if the edge attribute dictionary for the pair of nodes (u1, v1) in G1 and (u2, v2) in G2 should be considered equal during the isomorphism test. If None, then no attributes are considered when testing for an isomorphism.

The function will be called like

edge_match(G1[u1][v1], G2[u2][v2]).

That is, the function will receive the edge attribute dictionaries of the edges under consideration.

Notes

Uses the vf2 algorithm. Works for Graph, DiGraph, MultiGraph, and MultiDiGraph.

Examples

>>> import networkx as nx
>>> import networkx.algorithms.isomorphism as iso

For digraphs G1 and G2, using ‘weight’ edge attribute (default: 1) >>> G1 = nx.DiGraph() >>> G2 = nx.DiGraph() >>> G1.add_path([1,2,3,4],weight=1) >>> G2.add_path([10,20,30,40],weight=2) >>> em = iso.numerical_edge_match(‘weight’, 1) >>> nx.is_isomorphic(G1, G2) # no weights considered True >>> nx.is_isomorphic(G1, G2, edge_match=em) # match weights False

For multidigraphs G1 and G2, using ‘fill’ node attribute (default: ‘’) >>> G1 = nx.MultiDiGraph() >>> G2 = nx.MultiDiGraph() >>> G1.add_nodes_from([1,2,3],fill=’red’) >>> G2.add_nodes_from([10,20,30,40],fill=’red’) >>> G1.add_path([1,2,3,4],weight=3, linewidth=2.5) >>> G2.add_path([10,20,30,40],weight=3) >>> nm = iso.categorical_node_match(‘fill’, ‘red’) >>> nx.is_isomorphic(G1, G2, node_match=nm) True

For multidigraphs G1 and G2, using ‘weight’ edge attribute (default: 7) >>> G1.add_edge(1,2, weight=7) >>> G2.add_edge(10,20) >>> em = iso.numerical_multiedge_match(‘weight’, 7, rtol=1e-6) >>> nx.is_isomorphic(G1, G2, edge_match=em) True

For multigraphs G1 and G2, using ‘weight’ and ‘linewidth’ edge attributes with default values 7 and 2.5. Also using ‘fill’ node attribute with default value ‘red’. >>> em = iso.numerical_multiedge_match([‘weight’, ‘linewidth’], [7, 2.5]) >>> nm = iso.categorical_node_match(‘fill’, ‘red’) >>> nx.is_isomorphic(G1, G2, edge_match=em, node_match=nm) True