File: isomorphism.html

package info (click to toggle)
boost 1.33.1-10
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 100,948 kB
  • ctags: 145,103
  • sloc: cpp: 573,492; xml: 49,055; python: 15,626; ansic: 13,588; sh: 2,099; yacc: 858; makefile: 660; perl: 427; lex: 111; csh: 6
file content (169 lines) | stat: -rw-r--r-- 6,409 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<HTML>
<!--
  -- Copyright (c) Jeremy Siek 2000
  --
  -- Permission to use, copy, modify, distribute and sell this software
  -- and its documentation for any purpose is hereby granted without fee,
  -- provided that the above copyright notice appears in all copies and
  -- that both that copyright notice and this permission notice appear
  -- in supporting documentation.  Silicon Graphics makes no
  -- representations about the suitability of this software for any
  -- purpose.  It is provided "as is" without express or implied warranty.
  -->
<Head>
<Title>Boost Graph Library: Isomorphism</Title>
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b" 
        ALINK="#ff0000"> 
<IMG SRC="../../../boost.png" 
     ALT="C++ Boost" width="277" height="86"> 

<BR Clear>

<H1>
<img src="figs/python.gif" alt="(Python)"/>
<TT>isomorphism</TT>
</H1>


<PRE>
<i>// named parameter version</i>
template &lt;class Graph1, class Graph2, class P, class T, class R&gt;
bool isomorphism(const Graph1&amp; g1, const Graph2&amp; g2,
                 const bgl_named_params&lt;P,T,R&gt;&amp; params = <i>all defaults</i>)

<i>// non-named parameter version</i>
template &lt;typename Graph1, typename Graph2, 
	  typename IndexMapping, typename VertexInvariant,
	  typename V1Map, typename V2Map&gt;
bool isomorphism(const Graph1&amp; g1, const Graph2&amp; g2,
		 IsoMap f, VertexInvariant invariant,
		 VertexIndex1Map i1_map, VertexIndex2Map i2_map)
</pre>

<p>
An <b><i>isomorphism</i></b> is a 1-to-1 mapping of the vertices in
one graph to the vertices of another graph such that adjacency is
preserved. Another words, given graphs <i>G<sub>1</sub> =
(V<sub>1</sub>,E<sub>1</sub>)</i> and <i>G<sub>2</sub> =
(V<sub>2</sub>,E<sub>2</sub>)</i> an isomorphism is a function
<i>f</i> such that for all pairs of vertices <i>a,b</i> in
<i>V<sub>1</sub></i>, edge <i>(a,b)</i> is in <i>E<sub>1</sub></i> if
and only if edge <i>(f(a),f(b))</i> is in <i>E<sub>2</sub></i>.
</p>

<p>
This function returns <tt>true</tt> if there exists an isomorphism
between graph 1 and graph 2 and <tt>false</tt> otherwise. Also, if a
isomorphism map named parameter is provided then an isomorphism is
recorded in the map.
</p>

<p>
The current implementation is based on descriptions of a backtracking
algorithm in [<a
href="./bibliography.html#fortin96:_graph_iso_prob">46</a>,<a
href="./bibliography.html#reingold77:_combin_algo">48</a>].  The file
<a href="./isomorphism-impl.pdf">isomorphism-impl.pdf</a> contains a
&quot;literate&quot; description of the implementation.  The algorithm
used is simple but slow. A more efficient (and much more complex)
algorithm is described in [<a
href="./bibliography.html#mckay81:_pract_graph_iso">47</a>]. When (and
if) a version of this algorithm is ported to the BGL interface it
should replace the current algorithm.
</p>

<H3>Where Defined</H3>

<a href="../../../boost/graph/isomorphism.hpp"><TT>boost/graph/isomorphism.hpp</TT></a>

<h3>Parameters</h3>

IN: <tt>const Graph1&amp; g1</tt>
<blockquote>
A directed or undirected graph. The graph type must model of <a
href="./VertexListGraph.html">Vertex List Graph</a> and <a
href="./EdgeListGraph.html">Edge List Graph</a>.
</blockquote>

IN: <tt>const Graph2&amp; g2</tt>
<blockquote>
A directed or undirected graph. The graph type must model <a
href="./BidirectionalGraph.html">Bidirectional Graph</a> and <a
href="./VertexListGraph.html">Vertex List Graph</a>.
</blockquote>

<h3>Named Parameters</h3>

OUT: <tt>isomorphism_map(IsoMap f)</tt>
<blockquote>
The mapping from vertices in graph 1 to vertices in graph 2. This must
be a <a href="../../property_map/ReadWritePropertyMap.html">Read/Write
Property Map</a>.<br> <b>Default:</b> an <a
href="../../property_map/iterator_property_map.html"><tt>iterator_property_map</tt></a>
constructed from a <tt>std::vector</tt> of graph 2's vertex
descriptor type and the vertex index map for graph 1.<br>
<b>Python</b>: Must be a <tt>vertex_vertex_map</tt> for the first graph.
</blockquote>

IN: <tt>vertex_invariant(VertexInvariant i)</tt>
<blockquote>
A mapping <i>i</i> from vertices to integers such that if there is
some isomorphism that maps <i>v</i> onto <i>v'</i> then <i>i(v) ==
i(v')</i>. The <tt>VertexInvariant</tt> type must be a <a
href="http://www.sgi.com/tech/stl/BinaryFunction.html">BinaryFunction</a>
where the first argument is a vertex descriptor, the second argument is a
graph, and the result type is an integer. The vertex invariant must
work with the types for both graph 1 and graph 2 and therefore may need
to have a templated <tt>operator()</tt>.
<br>
<b>Default:</b> <tt>degree_vertex_invariant</tt><br>
<b>Python</b>: Any callable Python object will suffice.
</blockquote>

IN: <tt>vertex_index1_map(VertexIndex1Map i1_map)</tt>
<blockquote>
This maps each vertex to an integer in the range <tt>[0,
num_vertices(g))</tt>. This is necessary for efficient updates of the
heap data structure when an edge is relaxed. The type
<tt>VertexIndex1Map</tt> must be a model of <a
href="../../property_map/ReadablePropertyMap.html">Readable Property
Map</a>. The value type of the map must be an integer type. The vertex
descriptor type of graph 1 needs to be usable as the key type of the
map.<br>
<b>Default:</b> <tt>get(vertex_index, g1)</tt><br>
<b>Python</b>: Unsupported parameter.
</blockquote>

IN: <tt>vertex_index2_map(VertexIndex2Map i2_map)</tt>
<blockquote>
This maps each vertex to an integer in the range <tt>[0,
num_vertices(g))</tt>. This is necessary for efficient updates of the
heap data structure when an edge is relaxed. The type
<tt>VertexIndex2Map</tt> must be a model of <a
href="../../property_map/ReadablePropertyMap.html">Readable Property
Map</a>. The value type of the map must be an integer type. The vertex
descriptor type of graph 2 needs to be usable as the key type of the
map.<br>
<b>Default:</b> <tt>get(vertex_index, g2)</tt><br>
<b>Python</b>: Unsupported parameter.
</blockquote>


<h3>Complexity</h3>

The worst-case time complexity is <i>O(|V|!)</i>.

<h3>Example</h3>

See <a href="../example/isomorphism.cpp"><tt>libs/graph/example/isomorphism.cpp</tt></a>.

<br>
<HR>
<TABLE>
<TR valign=top>
<TD nowrap>Copyright &copy 2000-2001</TD><TD>
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
</TD></TR></TABLE>

</BODY>
</HTML>