diff mayachemtools/docs/modules/html/code/Graph.html @ 0:73ae111cf86f draft

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 11:55:01 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mayachemtools/docs/modules/html/code/Graph.html	Wed Jan 20 11:55:01 2016 -0500
@@ -0,0 +1,3433 @@
+<html>
+<head>
+<title>MayaChemTools:Code:Graph.pm</title>
+<meta http-equiv="content-type" content="text/html;charset=utf-8">
+<link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css">
+</head>
+<body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10">
+<br/>
+<center>
+<a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a>
+</center>
+<br/>
+<pre>
+<a name="package-Graph-"></a>   1 <span class="k">package </span><span class="i">Graph</span><span class="sc">;</span>
+   2 <span class="c">#</span>
+   3 <span class="c"># $RCSfile: Graph.pm,v $</span>
+   4 <span class="c"># $Date: 2015/02/28 20:47:17 $</span>
+   5 <span class="c"># $Revision: 1.46 $</span>
+   6 <span class="c">#</span>
+   7 <span class="c"># Author: Manish Sud &lt;msud@san.rr.com&gt;</span>
+   8 <span class="c">#</span>
+   9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span>
+  10 <span class="c">#</span>
+  11 <span class="c"># This file is part of MayaChemTools.</span>
+  12 <span class="c">#</span>
+  13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span>
+  14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span>
+  15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span>
+  16 <span class="c"># later version.</span>
+  17 <span class="c">#</span>
+  18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span>
+  19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span>
+  20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span>
+  21 <span class="c"># details.</span>
+  22 <span class="c">#</span>
+  23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span>
+  24 <span class="c"># along with MayaChemTools; if not, see &lt;http://www.gnu.org/licenses/&gt; or</span>
+  25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span>
+  26 <span class="c"># Boston, MA, 02111-1307, USA.</span>
+  27 <span class="c">#</span>
+  28 
+  29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
+  30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span>
+  31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span>
+  32 <span class="k">use</span> <span class="w">Storable</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  33 <span class="k">use</span> <span class="w">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  34 <span class="k">use</span> <span class="w">Graph::CyclesDetection</span><span class="sc">;</span>
+  35 <span class="k">use</span> <span class="w">Graph::PathsTraversal</span><span class="sc">;</span>
+  36 <span class="k">use</span> <span class="w">Graph::GraphMatrix</span><span class="sc">;</span>
+  37 
+  38 <span class="k">use</span> <span class="w">vars</span> <span class="q">qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS)</span><span class="sc">;</span>
+  39 
+  40 <span class="i">@ISA</span> = <span class="q">qw(Exporter)</span><span class="sc">;</span>
+  41 <span class="i">@EXPORT</span> = <span class="q">qw(IsGraph)</span><span class="sc">;</span>
+  42 <span class="i">@EXPORT_OK</span> = <span class="q">qw()</span><span class="sc">;</span>
+  43 
+  44 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span><span class="w">all</span>  <span class="cm">=&gt;</span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span><span class="s">)</span><span class="sc">;</span>
+  45 
+  46 <span class="c"># Setup class variables...</span>
+  47 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="sc">;</span>
+  48 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  49 
+  50 <span class="c"># Overload Perl functions...</span>
+  51 <span class="k">use</span> <span class="w">overload</span> <span class="q">&#39;&quot;&quot;&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;StringifyGraph&#39;</span><span class="sc">;</span>
+  52 
+  53 <span class="c"># Class constructor...</span>
+<a name="new-"></a>  54 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span>
+  55   <span class="k">my</span><span class="s">(</span><span class="i">$Class</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+  56 
+  57   <span class="c"># Initialize object...</span>
+  58   <span class="k">my</span> <span class="i">$This</span> = <span class="s">{</span><span class="s">}</span><span class="sc">;</span>
+  59   <span class="k">bless</span> <span class="i">$This</span><span class="cm">,</span> <span class="k">ref</span><span class="s">(</span><span class="i">$Class</span><span class="s">)</span> || <span class="i">$Class</span><span class="sc">;</span>
+  60   <span class="i">$This</span><span class="i">-&gt;_InitializeGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  61 
+  62   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> <span class="i">$This</span><span class="i">-&gt;AddVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> <span class="s">}</span>
+  63 
+  64   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+  65 <span class="s">}</span>
+  66 
+  67 <span class="c"># Initialize object data...</span>
+<a name="_InitializeGraph-"></a>  68 <span class="k">sub </span><span class="m">_InitializeGraph</span> <span class="s">{</span>
+  69   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+  70 
+  71   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  72 
+  73   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Edges</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  74   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  75   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  76 
+  77   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  78   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Graph</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  79   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  80   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  81 <span class="s">}</span>
+  82 
+  83 <span class="c"># Initialize class ...</span>
+<a name="_InitializeClass-"></a>  84 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span>
+  85   <span class="c">#Class name...</span>
+  86   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span>
+  87 <span class="s">}</span>
+  88 
+  89 <span class="c"># Add a vertex...</span>
+<a name="AddVertex-"></a>  90 <span class="k">sub </span><span class="m">AddVertex</span> <span class="s">{</span>
+  91   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+  92 
+  93   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$VertexID</span> <span class="s">)</span> <span class="s">{</span>
+  94     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddVertex: No vertex added: Vertex ID must be specified...&quot;</span><span class="sc">;</span>
+  95     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+  96   <span class="s">}</span>
+  97   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+  98     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddVertex: Didn&#39;t add vertex $VertexID: Already exists in the graph...&quot;</span><span class="sc">;</span>
+  99     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 100   <span class="s">}</span>
+ 101 
+ 102   <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>} = <span class="i">$VertexID</span><span class="sc">;</span>
+ 103 
+ 104   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 105 <span class="s">}</span>
+ 106 
+ 107 <span class="c"># Add vertices to the graph and return graph...</span>
+<a name="AddVertices-"></a> 108 <span class="k">sub </span><span class="m">AddVertices</span> <span class="s">{</span>
+ 109   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 110 
+ 111   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 112     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddVertices: No vertices added: Vertices list is empty...&quot;</span><span class="sc">;</span>
+ 113     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 114   <span class="s">}</span>
+ 115 
+ 116   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 117   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 118     <span class="i">$This</span><span class="i">-&gt;AddVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 119   <span class="s">}</span>
+ 120 
+ 121   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 122 <span class="s">}</span>
+ 123 
+ 124 <span class="c"># Delete a vertex...</span>
+<a name="DeleteVertex-"></a> 125 <span class="k">sub </span><span class="m">DeleteVertex</span> <span class="s">{</span>
+ 126   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 127 
+ 128   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$VertexID</span> <span class="s">)</span> <span class="s">{</span>
+ 129     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteVertex: No vertex deleted: Vertex ID must be specified...&quot;</span><span class="sc">;</span>
+ 130     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 131   <span class="s">}</span>
+ 132   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 133     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteVertex: Didn&#39;t delete vertex $VertexID: Vertex $VertexID doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+ 134     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 135   <span class="s">}</span>
+ 136   <span class="i">$This</span><span class="i">-&gt;_DeleteVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 137 
+ 138   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 139 <span class="s">}</span>
+ 140 
+ 141 <span class="c"># Delete vertex...</span>
+<a name="_DeleteVertex-"></a> 142 <span class="k">sub </span><span class="m">_DeleteVertex</span> <span class="s">{</span>
+ 143   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 144 
+ 145   <span class="c"># Delete corresponding edges; the corresponding edge properties are deleted during</span>
+ 146   <span class="c"># edges deletetion...</span>
+ 147   <span class="k">my</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 148   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 149   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 150     <span class="i">$This</span><span class="i">-&gt;DeleteEdges</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 151   <span class="s">}</span>
+ 152 
+ 153   <span class="c"># Delete the vertex and any properties associated with vertex...</span>
+ 154   <span class="i">$This</span><span class="i">-&gt;DeleteVertexProperties</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 155   <span class="k">delete</span> <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="sc">;</span>
+ 156 <span class="s">}</span>
+ 157 
+ 158 <span class="c"># Delete vertices...</span>
+<a name="DeleteVertices-"></a> 159 <span class="k">sub </span><span class="m">DeleteVertices</span> <span class="s">{</span>
+ 160   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 161 
+ 162   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 163     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteVertices: No vertices deleted: Vertices list is empty...&quot;</span><span class="sc">;</span>
+ 164     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 165   <span class="s">}</span>
+ 166   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 167   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 168     <span class="i">$This</span><span class="i">-&gt;DeleteVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 169   <span class="s">}</span>
+ 170 
+ 171   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 172 <span class="s">}</span>
+ 173 
+ 174 <span class="c"># Get vertex data...</span>
+<a name="GetVertex-"></a> 175 <span class="k">sub </span><span class="m">GetVertex</span> <span class="s">{</span>
+ 176   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 177 
+ 178   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$VertexID</span><span class="s">)</span> <span class="s">{</span>
+ 179     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 180   <span class="s">}</span>
+ 181 
+ 182   <span class="k">return</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> ? <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>} <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span>
+ 183 <span class="s">}</span>
+ 184 
+ 185 <span class="c"># Get data for all vertices or those specifed in the list. In scalar context, returned</span>
+ 186 <span class="c"># the number of vertices found.</span>
+ 187 <span class="c">#</span>
+<a name="GetVertices-"></a> 188 <span class="k">sub </span><span class="m">GetVertices</span> <span class="s">{</span>
+ 189   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 190   <span class="k">my</span><span class="s">(</span><span class="i">$ValuesCount</span><span class="cm">,</span> <span class="i">@VertexValues</span><span class="s">)</span><span class="sc">;</span>
+ 191 
+ 192   <span class="i">@VertexValues</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 193   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 194     <span class="i">@VertexValues</span> = <span class="k">map</span> <span class="s">{</span> <span class="i">$This</span><span class="i">-&gt;GetVertex</span><span class="s">(</span><span class="i">$_</span><span class="s">)</span> <span class="s">}</span> <span class="i">@VertexIDs</span><span class="sc">;</span>
+ 195     <span class="i">$ValuesCount</span> = <span class="k">grep</span> <span class="s">{</span> <span class="n">1</span> <span class="s">}</span> <span class="i">@VertexValues</span><span class="sc">;</span>
+ 196   <span class="s">}</span>
+ 197   <span class="k">else</span> <span class="s">{</span>
+ 198     <span class="i">@VertexValues</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> &lt;=&gt; <span class="i">$b</span> <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="sc">;</span>
+ 199     <span class="i">$ValuesCount</span> = <span class="i">@VertexValues</span><span class="sc">;</span>
+ 200   <span class="s">}</span>
+ 201 
+ 202   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@VertexValues</span> <span class="co">:</span> <span class="i">$ValuesCount</span><span class="sc">;</span>
+ 203 <span class="s">}</span>
+ 204 
+ 205 <span class="c"># Is this vertex present?</span>
+<a name="HasVertex-"></a> 206 <span class="k">sub </span><span class="m">HasVertex</span> <span class="s">{</span>
+ 207   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 208 
+ 209   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$VertexID</span><span class="s">)</span> <span class="s">{</span>
+ 210     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 211   <span class="s">}</span>
+ 212   <span class="k">return</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+ 213 <span class="s">}</span>
+ 214 
+ 215 <span class="c"># Are these vertices present? Return an array containing 1 or 0  for each vertex.</span>
+ 216 <span class="c"># In scalar context, return number of vertices found.</span>
+<a name="HasVertices-"></a> 217 <span class="k">sub </span><span class="m">HasVertices</span> <span class="s">{</span>
+ 218   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 219 
+ 220   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 221     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 222   <span class="s">}</span>
+ 223   <span class="k">my</span><span class="s">(</span><span class="i">$VerticesCount</span><span class="cm">,</span> <span class="i">@VerticesStatus</span><span class="s">)</span><span class="sc">;</span>
+ 224 
+ 225   <span class="i">@VerticesStatus</span> = <span class="k">map</span> <span class="s">{</span> <span class="i">$This</span><span class="i">-&gt;HasVertex</span><span class="s">(</span><span class="i">$_</span><span class="s">)</span> <span class="s">}</span> <span class="i">@VertexIDs</span><span class="sc">;</span>
+ 226   <span class="i">$VerticesCount</span> = <span class="k">grep</span> <span class="s">{</span> <span class="n">1</span> <span class="s">}</span>  <span class="i">@VerticesStatus</span><span class="sc">;</span>
+ 227 
+ 228   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@VerticesStatus</span> <span class="co">:</span> <span class="i">$VerticesCount</span><span class="sc">;</span>
+ 229 <span class="s">}</span>
+ 230 
+ 231 <span class="c"># Add an edge...</span>
+<a name="AddEdge-"></a> 232 <span class="k">sub </span><span class="m">AddEdge</span> <span class="s">{</span>
+ 233   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 234 
+ 235   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 236     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddEdge: No edge added: Both vertices must be defined...&quot;</span><span class="sc">;</span>
+ 237     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 238   <span class="s">}</span>
+ 239   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertex</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 240     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddEdge: Didn&#39;t add edge between vertices $VertexID1 and $VertexID2: Vertex $VertexID1 doesn&#39;s exist...&quot;</span><span class="sc">;</span>
+ 241     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 242   <span class="s">}</span>
+ 243   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertex</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 244     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddEdge: Didn&#39;t add edge between vertices $VertexID1 and $VertexID2: Vertex $VertexID2 doesn&#39;s exist...&quot;</span><span class="sc">;</span>
+ 245     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 246   <span class="s">}</span>
+ 247   <span class="k">if</span> <span class="s">(</span><span class="i">$VertexID1</span> == <span class="i">$VertexID2</span><span class="s">)</span> <span class="s">{</span>
+ 248     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddEdge: Didn&#39;t add edge between vertices $VertexID1 and $VertexID2: Vertices must be different...&quot;</span><span class="sc">;</span>
+ 249     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 250   <span class="s">}</span>
+ 251   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasEdge</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 252     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddEdge: Didn&#39;t add edge between vertices $VertexID1 and $VertexID2: Edge already exists...&quot;</span><span class="sc">;</span>
+ 253     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 254   <span class="s">}</span>
+ 255 
+ 256   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span>
+ 257     <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID1</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 258   <span class="s">}</span>
+ 259   <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>} = <span class="i">$VertexID2</span><span class="sc">;</span>
+ 260 
+ 261   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span>
+ 262     <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID2</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 263   <span class="s">}</span>
+ 264   <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID2</span>}-&gt;{<span class="i">$VertexID1</span>} = <span class="i">$VertexID1</span><span class="sc">;</span>
+ 265 
+ 266   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 267 <span class="s">}</span>
+ 268 
+ 269 <span class="c"># Add edges...</span>
+<a name="AddEdges-"></a> 270 <span class="k">sub </span><span class="m">AddEdges</span> <span class="s">{</span>
+ 271   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 272 
+ 273   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 274     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddEdges: No edges added: Vertices list is empty...&quot;</span><span class="sc">;</span>
+ 275     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 276   <span class="s">}</span>
+ 277   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+ 278     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddEdges: No edges added: Invalid vertices data: Input list must contain even number of vertex IDs...&quot;</span><span class="sc">;</span>
+ 279     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 280   <span class="s">}</span>
+ 281   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
+ 282   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#VertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+ 283     <span class="i">$VertexID1</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+ 284     <span class="i">$This</span><span class="i">-&gt;AddEdge</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+ 285   <span class="s">}</span>
+ 286 
+ 287   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 288 <span class="s">}</span>
+ 289 
+ 290 <span class="c"># Delete an edge...</span>
+<a name="DeleteEdge-"></a> 291 <span class="k">sub </span><span class="m">DeleteEdge</span> <span class="s">{</span>
+ 292   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 293 
+ 294   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 295     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;Delete: No edge deleted: Both vertices must be defined...&quot;</span><span class="sc">;</span>
+ 296     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 297   <span class="s">}</span>
+ 298   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertex</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 299     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteEdge: Didn&#39;t delete edge between vertices $VertexID1 and $VertexID2: Vertex $VertexID1 doesn&#39;s exist...&quot;</span><span class="sc">;</span>
+ 300     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 301   <span class="s">}</span>
+ 302   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertex</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 303     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteEdge: Didn&#39;t delete edge between vertices $VertexID1 and $VertexID2: Vertex $VertexID2 doesn&#39;s exist...&quot;</span><span class="sc">;</span>
+ 304     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 305   <span class="s">}</span>
+ 306   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasEdge</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 307     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteEdge: Didn&#39;t delete edge between vertices $VertexID1 and $VertexID2: Edge doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+ 308     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 309   <span class="s">}</span>
+ 310   <span class="i">$This</span><span class="i">-&gt;_DeleteEdge</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+ 311   <span class="i">$This</span><span class="i">-&gt;_DeleteEdge</span><span class="s">(</span><span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="sc">;</span>
+ 312 <span class="s">}</span>
+ 313 
+ 314 <span class="c"># Delete edge...</span>
+<a name="_DeleteEdge-"></a> 315 <span class="k">sub </span><span class="m">_DeleteEdge</span> <span class="s">{</span>
+ 316   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 317 
+ 318   <span class="c"># Delete the edge...</span>
+ 319   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span>
+ 320     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span>
+ 321       <span class="k">delete</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}<span class="sc">;</span>
+ 322     <span class="s">}</span>
+ 323     <span class="k">if</span> <span class="s">(</span>! <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID1</span>}}<span class="s">)</span> <span class="s">{</span>
+ 324       <span class="k">delete</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID1</span>}<span class="sc">;</span>
+ 325     <span class="s">}</span>
+ 326   <span class="s">}</span>
+ 327 
+ 328   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span>
+ 329     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID2</span>}-&gt;{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span>
+ 330       <span class="k">delete</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID2</span>}-&gt;{<span class="i">$VertexID1</span>}<span class="sc">;</span>
+ 331     <span class="s">}</span>
+ 332     <span class="k">if</span> <span class="s">(</span>! <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID2</span>}}<span class="s">)</span> <span class="s">{</span>
+ 333       <span class="k">delete</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID2</span>}<span class="sc">;</span>
+ 334     <span class="s">}</span>
+ 335   <span class="s">}</span>
+ 336 
+ 337   <span class="c"># Delete properties associated with the edge...</span>
+ 338   <span class="i">$This</span><span class="i">-&gt;DeleteEdgeProperties</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+ 339 <span class="s">}</span>
+ 340 
+ 341 <span class="c"># Delete edges...</span>
+<a name="DeleteEdges-"></a> 342 <span class="k">sub </span><span class="m">DeleteEdges</span> <span class="s">{</span>
+ 343   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 344 
+ 345   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 346     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteEdges: No edges deleted: Vertices list is empty...&quot;</span><span class="sc">;</span>
+ 347     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 348   <span class="s">}</span>
+ 349   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+ 350     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteEdges: No edges deleted: Invalid vertices data: Input list must contain even number of vertex IDs...&quot;</span><span class="sc">;</span>
+ 351     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 352   <span class="s">}</span>
+ 353   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
+ 354   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#VertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+ 355     <span class="i">$VertexID1</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+ 356     <span class="i">$This</span><span class="i">-&gt;DeleteEdge</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+ 357   <span class="s">}</span>
+ 358 
+ 359   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 360 <span class="s">}</span>
+ 361 
+ 362 <span class="c"># Does the edge defiend by a vertex pair exists? Edges defined from VertexID1 to VertecID2</span>
+ 363 <span class="c"># and VertexID2 to VertexID1 are considered equivalent...</span>
+<a name="HasEdge-"></a> 364 <span class="k">sub </span><span class="m">HasEdge</span> <span class="s">{</span>
+ 365   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 366 
+ 367   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 368     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 369   <span class="s">}</span>
+ 370 
+ 371   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;_HasEdge</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> || <span class="i">$This</span><span class="i">-&gt;_HasEdge</span><span class="s">(</span><span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+ 372 <span class="s">}</span>
+ 373 
+ 374 <span class="c"># Does edge exists?</span>
+<a name="_HasEdge-"></a> 375 <span class="k">sub </span><span class="m">_HasEdge</span> <span class="s">{</span>
+ 376   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 377 
+ 378   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span>
+ 379     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span>
+ 380       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+ 381     <span class="s">}</span>
+ 382   <span class="s">}</span>
+ 383   <span class="k">elsif</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span>
+ 384     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID2</span>}-&gt;{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span>
+ 385       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+ 386     <span class="s">}</span>
+ 387   <span class="s">}</span>
+ 388   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 389 <span class="s">}</span>
+ 390 
+ 391 <span class="c"># Do the edges defiend by vertex pairs exist? In scalar context, return the number</span>
+ 392 <span class="c"># of edges found...</span>
+<a name="HasEdges-"></a> 393 <span class="k">sub </span><span class="m">HasEdges</span> <span class="s">{</span>
+ 394   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 395 
+ 396   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 397     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 398   <span class="s">}</span>
+ 399   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+ 400     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 401   <span class="s">}</span>
+ 402   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$Status</span><span class="cm">,</span> <span class="i">$EdgesCount</span><span class="cm">,</span> <span class="i">@EdgesStatus</span><span class="s">)</span><span class="sc">;</span>
+ 403   <span class="i">@EdgesStatus</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 404   <span class="i">$EdgesCount</span> = <span class="n">0</span><span class="sc">;</span>
+ 405   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#VertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+ 406     <span class="i">$VertexID1</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+ 407     <span class="i">$Status</span> = <span class="i">$This</span><span class="i">-&gt;HasEdge</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+ 408     <span class="k">push</span> <span class="i">@EdgesStatus</span><span class="cm">,</span> <span class="s">(</span><span class="i">$Status</span><span class="s">)</span><span class="sc">;</span>
+ 409     <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Status</span><span class="s">)</span> &amp;&amp; <span class="i">$Status</span><span class="s">)</span> <span class="s">{</span>
+ 410       <span class="i">$EdgesCount</span>++<span class="sc">;</span>
+ 411     <span class="s">}</span>
+ 412   <span class="s">}</span>
+ 413   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@EdgesStatus</span> <span class="co">:</span> <span class="i">$EdgesCount</span><span class="sc">;</span>
+ 414 <span class="s">}</span>
+ 415 
+ 416 <span class="c"># Get edges for a vertex ID or retrieve all the edges. In scalar context,</span>
+ 417 <span class="c">#  return the number of edges.</span>
+ 418 <span class="c">#</span>
+<a name="GetEdges-"></a> 419 <span class="k">sub </span><span class="m">GetEdges</span> <span class="s">{</span>
+ 420   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 421   <span class="k">my</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 422 
+ 423   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 424   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$VertexID</span><span class="s">)</span> <span class="s">{</span>
+ 425     <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;_GetEdgesFrom</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;_GetEdgesTo</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span>
+ 426   <span class="s">}</span>
+ 427   <span class="k">else</span> <span class="s">{</span>
+ 428     <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;_GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 429   <span class="s">}</span>
+ 430   <span class="k">return</span> <span class="s">(</span><span class="k">wantarray</span> ? <span class="i">@VertexIDs</span> <span class="co">:</span> <span class="i">@VertexIDs</span>/<span class="n">2</span><span class="s">)</span><span class="sc">;</span>
+ 431 <span class="s">}</span>
+ 432 
+ 433 <span class="c"># Get edge starting from the vertex to its successor vertices...</span>
+<a name="_GetEdgesFrom-"></a> 434 <span class="k">sub </span><span class="m">_GetEdgesFrom</span> <span class="s">{</span>
+ 435   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 436   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span> = <span class="k">undef</span><span class="sc">;</span>
+ 437 
+ 438   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEdges</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+ 439 <span class="s">}</span>
+ 440 
+ 441 <span class="c"># Get edge starting from predecessors to the vertex...</span>
+<a name="_GetEdgesTo-"></a> 442 <span class="k">sub </span><span class="m">_GetEdgesTo</span> <span class="s">{</span>
+ 443   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 444   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span> = <span class="k">undef</span><span class="sc">;</span>
+ 445 
+ 446   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEdges</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+ 447 <span class="s">}</span>
+ 448 
+ 449 <span class="c"># Get edges as pair of vertex IDs. Edges data can be retrieved in three</span>
+ 450 <span class="c"># different ways:</span>
+ 451 <span class="c">#</span>
+ 452 <span class="c"># Both vertex IDs are defined: Returns existing edge between the vertices</span>
+ 453 <span class="c"># Only first vertex ID defined: Returns all edges at the vertex</span>
+ 454 <span class="c"># Only second vertex defined: Returns all edges at the vertex</span>
+ 455 <span class="c"># No vertex IDs defined: Returns all edges</span>
+ 456 <span class="c">#</span>
+<a name="_GetEdges-"></a> 457 <span class="k">sub </span><span class="m">_GetEdges</span> <span class="s">{</span>
+ 458   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 459   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 460 
+ 461   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 462 
+ 463   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 464     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasEdge</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 465       <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+ 466     <span class="s">}</span>
+ 467   <span class="s">}</span>
+ 468   <span class="k">elsif</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 469     <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;_GetNeighborsFrom</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 470       <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;_GetEdges</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 471     <span class="s">}</span>
+ 472   <span class="s">}</span>
+ 473   <span class="k">elsif</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 474     <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;_GetNeighborsTo</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 475       <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;_GetEdges</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+ 476     <span class="s">}</span>
+ 477   <span class="s">}</span>
+ 478   <span class="k">else</span> <span class="s">{</span>
+ 479     <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 480       <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;_GetEdges</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 481     <span class="s">}</span>
+ 482   <span class="s">}</span>
+ 483 
+ 484   <span class="k">return</span> <span class="i">@VertexIDs</span><span class="sc">;</span>
+ 485 <span class="s">}</span>
+ 486 
+ 487 <span class="c"># Add edges between successive pair of vertex IDs......</span>
+<a name="AddPath-"></a> 488 <span class="k">sub </span><span class="m">AddPath</span> <span class="s">{</span>
+ 489   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 490 
+ 491   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 492     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddPath: No path added: Vertices list is empty...&quot;</span><span class="sc">;</span>
+ 493     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 494   <span class="s">}</span>
+ 495   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
+ 496     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddPath: No path added: Invalid vertices data: Input list must contain more than on vertex ID...&quot;</span><span class="sc">;</span>
+ 497     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 498   <span class="s">}</span>
+ 499   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 500     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddPath: No path added: Some of the vertex IDs don&#39;t exist in the graph...&quot;</span><span class="sc">;</span>
+ 501     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 502   <span class="s">}</span>
+ 503   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasPath</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 504     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddPath: No path added: Path already exist in the graph...&quot;</span><span class="sc">;</span>
+ 505     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 506   <span class="s">}</span>
+ 507   <span class="k">my</span><span class="s">(</span><span class="i">@PathVertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 508   <span class="i">@PathVertexIDs</span> =<span class="i">$This</span><span class="i">-&gt; _SetupPathVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 509 
+ 510   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;AddEdges</span><span class="s">(</span><span class="i">@PathVertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 511 <span class="s">}</span>
+ 512 
+ 513 
+ 514 <span class="c"># Delete edges between successive pair of vertex IDs......</span>
+<a name="DeletePath-"></a> 515 <span class="k">sub </span><span class="m">DeletePath</span> <span class="s">{</span>
+ 516   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 517 
+ 518   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 519     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeletePath: No path deleted: Vertices list is empty...&quot;</span><span class="sc">;</span>
+ 520     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 521   <span class="s">}</span>
+ 522   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
+ 523     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeletePath: No path deleted: Invalid vertices data: Input list must contain more than on vertex ID...&quot;</span><span class="sc">;</span>
+ 524     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 525   <span class="s">}</span>
+ 526   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 527     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeletePath: No path deleted: Some of the vertex IDs don&#39;t exist in the graph...&quot;</span><span class="sc">;</span>
+ 528     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 529   <span class="s">}</span>
+ 530   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasPath</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 531     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeletePath: No path deleted: Path doesn&#39;t exist in the graph...&quot;</span><span class="sc">;</span>
+ 532     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 533   <span class="s">}</span>
+ 534   <span class="k">my</span><span class="s">(</span><span class="i">@PathVertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 535   <span class="i">@PathVertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;_SetupPathVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 536 
+ 537   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;DeleteEdges</span><span class="s">(</span><span class="i">@PathVertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 538 <span class="s">}</span>
+ 539 
+ 540 <span class="c"># Does the path defiend by edges between successive pairs of vertex IDs exist?</span>
+<a name="HasPath-"></a> 541 <span class="k">sub </span><span class="m">HasPath</span> <span class="s">{</span>
+ 542   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 543 
+ 544   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 545     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 546   <span class="s">}</span>
+ 547   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
+ 548     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 549   <span class="s">}</span>
+ 550   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 551     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 552   <span class="s">}</span>
+ 553   <span class="k">my</span><span class="s">(</span><span class="i">$Status</span><span class="cm">,</span> <span class="i">@PathVertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 554   <span class="i">@PathVertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;_SetupPathVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 555   <span class="i">$Status</span> = <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasEdges</span><span class="s">(</span><span class="i">@PathVertexIDs</span><span class="s">)</span> == <span class="s">(</span><span class="i">@PathVertexIDs</span>/<span class="n">2</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+ 556 
+ 557   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span>
+ 558 <span class="s">}</span>
+ 559 
+ 560 <span class="c"># Setup vertices for the path to define edges between successive pair of vertex IDs...</span>
+<a name="_SetupPathVertices-"></a> 561 <span class="k">sub </span><span class="m">_SetupPathVertices</span> <span class="s">{</span>
+ 562   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 563   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">@PathVertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 564 
+ 565   <span class="i">@PathVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 566   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$#VertexIDs</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 567     <span class="i">$VertexID1</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span>
+ 568     <span class="i">$VertexID2</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+ 569     <span class="k">push</span> <span class="i">@PathVertexIDs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+ 570   <span class="s">}</span>
+ 571 
+ 572   <span class="k">return</span> <span class="i">@PathVertexIDs</span><span class="sc">;</span>
+ 573 <span class="s">}</span>
+ 574 
+ 575 <span class="c"># Add edges between successive pair of vertex IDs and an additional edge from the last to</span>
+ 576 <span class="c"># the first ID to complete the cycle......</span>
+<a name="AddCycle-"></a> 577 <span class="k">sub </span><span class="m">AddCycle</span> <span class="s">{</span>
+ 578   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 579 
+ 580   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 581     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddCycle: No cycle added: Vertices list is empty...&quot;</span><span class="sc">;</span>
+ 582     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 583   <span class="s">}</span>
+ 584   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
+ 585     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddCycle: No cycle added: Invalid vertices data: Input list must contain more than on vertex ID...&quot;</span><span class="sc">;</span>
+ 586     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 587   <span class="s">}</span>
+ 588   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 589     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddCycle: No cycle added: Some of the vertex IDs don&#39;t exist in the graph...&quot;</span><span class="sc">;</span>
+ 590     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 591   <span class="s">}</span>
+ 592   <span class="k">my</span><span class="s">(</span><span class="i">$FirstVertextID</span><span class="s">)</span> = <span class="i">$VertexIDs</span>[<span class="n">0</span>]<span class="sc">;</span>
+ 593   <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$FirstVertextID</span><span class="s">)</span><span class="sc">;</span>
+ 594 
+ 595   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasCycle</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 596     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddCycle: No cycle added: Cycle already exist in the graph...&quot;</span><span class="sc">;</span>
+ 597     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 598   <span class="s">}</span>
+ 599 
+ 600   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;AddPath</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 601 <span class="s">}</span>
+ 602 
+ 603 <span class="c"># Delete edges between successive pair of vertex IDs and an additional edge from the last to</span>
+ 604 <span class="c"># the first ID to complete the cycle......</span>
+<a name="DeleteCycle-"></a> 605 <span class="k">sub </span><span class="m">DeleteCycle</span> <span class="s">{</span>
+ 606   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 607 
+ 608   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 609     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteCycle: No cycle deleted: Vertices list is empty...&quot;</span><span class="sc">;</span>
+ 610     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 611   <span class="s">}</span>
+ 612   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
+ 613     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteCycle: No cycle deleted: Invalid vertices data: Input list must contain more than on vertex ID...&quot;</span><span class="sc">;</span>
+ 614     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 615   <span class="s">}</span>
+ 616   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 617     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteCycle: No cycle deleted: Some of the vertex IDs don&#39;t exist in the graph...&quot;</span><span class="sc">;</span>
+ 618     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 619   <span class="s">}</span>
+ 620   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasCycle</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 621     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteCycle: No cycle deleted: Cycle doesn&#39;t exist in the graph...&quot;</span><span class="sc">;</span>
+ 622     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 623   <span class="s">}</span>
+ 624 
+ 625   <span class="k">my</span><span class="s">(</span><span class="i">$FirstVertextID</span><span class="s">)</span> = <span class="i">$VertexIDs</span>[<span class="n">0</span>]<span class="sc">;</span>
+ 626   <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$FirstVertextID</span><span class="s">)</span><span class="sc">;</span>
+ 627 
+ 628   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;DeletePath</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 629 <span class="s">}</span>
+ 630 
+ 631 <span class="c"># Does the cycle defiend by edges between successive pairs of vertex IDs along with an additional</span>
+ 632 <span class="c"># edge from last to first vertex ID exist?</span>
+<a name="HasCycle-"></a> 633 <span class="k">sub </span><span class="m">HasCycle</span> <span class="s">{</span>
+ 634   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 635 
+ 636   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 637     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 638   <span class="s">}</span>
+ 639   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
+ 640     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 641   <span class="s">}</span>
+ 642   <span class="k">my</span><span class="s">(</span><span class="i">$FirstVertextID</span><span class="s">)</span> = <span class="i">$VertexIDs</span>[<span class="n">0</span>]<span class="sc">;</span>
+ 643   <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$FirstVertextID</span><span class="s">)</span><span class="sc">;</span>
+ 644 
+ 645   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;HasPath</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 646 <span class="s">}</span>
+ 647 
+ 648 <span class="c"># Get neighbors...</span>
+<a name="GetNeighbors-"></a> 649 <span class="k">sub </span><span class="m">GetNeighbors</span> <span class="s">{</span>
+ 650   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 651 
+ 652   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$VertexID</span><span class="s">)</span> <span class="s">{</span>
+ 653     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 654   <span class="s">}</span>
+ 655   <span class="k">if</span> <span class="s">(</span>! <span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+ 656     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 657   <span class="s">}</span>
+ 658 
+ 659   <span class="c"># Get a list of unsorted vertices and sort &#39;em once before returning...</span>
+ 660   <span class="c">#</span>
+ 661   <span class="k">my</span><span class="s">(</span><span class="i">$VerticesCount</span><span class="cm">,</span> <span class="i">$SortVertices</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 662 
+ 663   <span class="i">$SortVertices</span> = <span class="n">0</span><span class="sc">;</span>
+ 664   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 665 
+ 666   <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;_GetNeighborsFrom</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$SortVertices</span><span class="s">)</span><span class="sc">;</span>
+ 667   <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;_GetNeighborsTo</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$SortVertices</span><span class="s">)</span><span class="sc">;</span>
+ 668   <span class="i">$VerticesCount</span> = <span class="i">@VertexIDs</span><span class="sc">;</span>
+ 669 
+ 670   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="k">sort</span> <span class="s">{</span><span class="i">$a</span> &lt;=&gt; <span class="i">$b</span><span class="s">}</span> <span class="i">@VertexIDs</span> <span class="co">:</span> <span class="i">$VerticesCount</span><span class="sc">;</span>
+ 671 <span class="s">}</span>
+ 672 
+ 673 <span class="c"># Get neighbors added by defining edges from the vertex. For undirected graph, it has no</span>
+ 674 <span class="c"># strict meaning...</span>
+<a name="_GetNeighborsFrom-"></a> 675 <span class="k">sub </span><span class="m">_GetNeighborsFrom</span> <span class="s">{</span>
+ 676   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$SortVertices</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 677   <span class="k">my</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 678 
+ 679   <span class="i">$SortVertices</span> = <span class="k">defined</span> <span class="i">$SortVertices</span> ? <span class="i">$SortVertices</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+ 680   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 681 
+ 682   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+ 683     <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="k">map</span> <span class="s">{</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID</span>}-&gt;{<span class="i">$_</span>} <span class="s">}</span>  <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID</span>}}<span class="sc">;</span>
+ 684   <span class="s">}</span>
+ 685   <span class="k">return</span> <span class="i">$SortVertices</span> ? <span class="k">sort</span> <span class="s">{</span><span class="i">$a</span> &lt;=&gt; <span class="i">$b</span><span class="s">}</span> <span class="i">@VertexIDs</span> <span class="co">:</span> <span class="i">@VertexIDs</span><span class="sc">;</span>
+ 686 <span class="s">}</span>
+ 687 
+ 688 <span class="c"># Get neighbors added by defining edges to the vertex. For undirected graphs, it has no</span>
+ 689 <span class="c"># strict meaning.</span>
+<a name="_GetNeighborsTo-"></a> 690 <span class="k">sub </span><span class="m">_GetNeighborsTo</span> <span class="s">{</span>
+ 691   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$SortVertices</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 692   <span class="k">my</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 693 
+ 694   <span class="i">$SortVertices</span> = <span class="k">defined</span> <span class="i">$SortVertices</span> ? <span class="i">$SortVertices</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+ 695   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 696 
+ 697   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+ 698     <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="k">map</span> <span class="s">{</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID</span>}-&gt;{<span class="i">$_</span>} <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID</span>}}<span class="sc">;</span>
+ 699   <span class="s">}</span>
+ 700   <span class="k">return</span> <span class="i">$SortVertices</span> ? <span class="k">sort</span> <span class="s">{</span><span class="i">$a</span> &lt;=&gt; <span class="i">$b</span><span class="s">}</span> <span class="i">@VertexIDs</span> <span class="co">:</span> <span class="i">@VertexIDs</span><span class="sc">;</span>
+ 701 <span class="s">}</span>
+ 702 
+ 703 <span class="c"># Get vertex degree...</span>
+ 704 <span class="c">#</span>
+<a name="GetDegree-"></a> 705 <span class="k">sub </span><span class="m">GetDegree</span> <span class="s">{</span>
+ 706   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 707 
+ 708   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$VertexID</span><span class="s">)</span> <span class="s">{</span>
+ 709     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 710   <span class="s">}</span>
+ 711   <span class="k">if</span> <span class="s">(</span>! <span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+ 712     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 713   <span class="s">}</span>
+ 714   <span class="k">my</span><span class="s">(</span><span class="i">$Degree</span><span class="s">)</span><span class="sc">;</span>
+ 715   <span class="i">$Degree</span> = <span class="i">$This</span><span class="i">-&gt;_GetInDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span> + <span class="i">$This</span><span class="i">-&gt;_GetOutDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 716 
+ 717   <span class="k">return</span> <span class="i">$Degree</span><span class="sc">;</span>
+ 718 <span class="s">}</span>
+ 719 
+ 720 <span class="c"># Get in degree added by defining edges to the vertex. For undirected graphs, it has no</span>
+ 721 <span class="c"># strict meaning.</span>
+ 722 <span class="c">#</span>
+<a name="_GetInDegree-"></a> 723 <span class="k">sub </span><span class="m">_GetInDegree</span> <span class="s">{</span>
+ 724   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 725   <span class="k">my</span><span class="s">(</span><span class="i">$Degree</span><span class="s">)</span><span class="sc">;</span>
+ 726 
+ 727   <span class="i">$Degree</span> = <span class="n">0</span><span class="sc">;</span>
+ 728   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+ 729     <span class="i">$Degree</span> = <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">To</span>}-&gt;{<span class="i">$VertexID</span>}}<span class="sc">;</span>
+ 730   <span class="s">}</span>
+ 731   <span class="k">return</span> <span class="i">$Degree</span><span class="sc">;</span>
+ 732 <span class="s">}</span>
+ 733 
+ 734 <span class="c"># Get out degree added by defining edges from the vertex. For undirected graphs, it has no</span>
+ 735 <span class="c"># strict meaning.</span>
+ 736 <span class="c">#</span>
+<a name="_GetOutDegree-"></a> 737 <span class="k">sub </span><span class="m">_GetOutDegree</span> <span class="s">{</span>
+ 738   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 739   <span class="k">my</span><span class="s">(</span><span class="i">$Degree</span><span class="s">)</span><span class="sc">;</span>
+ 740 
+ 741   <span class="i">$Degree</span> = <span class="n">0</span><span class="sc">;</span>
+ 742   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+ 743     <span class="i">$Degree</span> = <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Edges</span>}-&gt;{<span class="w">From</span>}-&gt;{<span class="i">$VertexID</span>}}<span class="sc">;</span>
+ 744   <span class="s">}</span>
+ 745   <span class="k">return</span> <span class="i">$Degree</span><span class="sc">;</span>
+ 746 <span class="s">}</span>
+ 747 
+ 748 <span class="c"># Get vertex with smallest degree...</span>
+ 749 <span class="c">#</span>
+<a name="GetVertexWithSmallestDegree-"></a> 750 <span class="k">sub </span><span class="m">GetVertexWithSmallestDegree</span> <span class="s">{</span>
+ 751   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 752   <span class="k">my</span><span class="s">(</span><span class="i">$Degree</span><span class="cm">,</span> <span class="i">$SmallestDegree</span><span class="cm">,</span> <span class="i">$SmallestDegreeVertexID</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 753 
+ 754   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 755   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 756   <span class="k">if</span> <span class="s">(</span>! <span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 757     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 758   <span class="s">}</span>
+ 759   <span class="i">$SmallestDegree</span> = <span class="n">99999</span><span class="sc">;</span> <span class="i">$SmallestDegreeVertexID</span> = <span class="k">undef</span><span class="sc">;</span>
+ 760 
+ 761   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 762     <span class="i">$Degree</span> = <span class="i">$This</span><span class="i">-&gt;_GetInDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span> + <span class="i">$This</span><span class="i">-&gt;_GetOutDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 763     <span class="k">if</span> <span class="s">(</span><span class="i">$Degree</span> &lt; <span class="i">$SmallestDegree</span><span class="s">)</span> <span class="s">{</span>
+ 764       <span class="i">$SmallestDegree</span> = <span class="i">$Degree</span><span class="sc">;</span>
+ 765       <span class="i">$SmallestDegreeVertexID</span> = <span class="i">$VertexID</span><span class="sc">;</span>
+ 766     <span class="s">}</span>
+ 767   <span class="s">}</span>
+ 768   <span class="k">return</span> <span class="i">$SmallestDegreeVertexID</span><span class="sc">;</span>
+ 769 <span class="s">}</span>
+ 770 
+ 771 <span class="c"># Get vertex with largest degree...</span>
+ 772 <span class="c">#</span>
+<a name="GetVertexWithLargestDegree-"></a> 773 <span class="k">sub </span><span class="m">GetVertexWithLargestDegree</span> <span class="s">{</span>
+ 774   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 775   <span class="k">my</span><span class="s">(</span><span class="i">$Degree</span><span class="cm">,</span> <span class="i">$LargestDegree</span><span class="cm">,</span> <span class="i">$LargestDegreeVertexID</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 776 
+ 777   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 778   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 779   <span class="k">if</span> <span class="s">(</span>! <span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 780     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 781   <span class="s">}</span>
+ 782   <span class="i">$LargestDegree</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$LargestDegreeVertexID</span> = <span class="k">undef</span><span class="sc">;</span>
+ 783 
+ 784   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 785     <span class="i">$Degree</span> = <span class="i">$This</span><span class="i">-&gt;_GetInDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span> + <span class="i">$This</span><span class="i">-&gt;_GetOutDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 786     <span class="k">if</span> <span class="s">(</span><span class="i">$Degree</span> &gt; <span class="i">$LargestDegree</span><span class="s">)</span> <span class="s">{</span>
+ 787       <span class="i">$LargestDegree</span> = <span class="i">$Degree</span><span class="sc">;</span>
+ 788       <span class="i">$LargestDegreeVertexID</span> = <span class="i">$VertexID</span><span class="sc">;</span>
+ 789     <span class="s">}</span>
+ 790   <span class="s">}</span>
+ 791   <span class="k">return</span> <span class="i">$LargestDegreeVertexID</span><span class="sc">;</span>
+ 792 <span class="s">}</span>
+ 793 
+ 794 <span class="c"># Get maximum degree in the graph...</span>
+ 795 <span class="c">#</span>
+<a name="GetMaximumDegree-"></a> 796 <span class="k">sub </span><span class="m">GetMaximumDegree</span> <span class="s">{</span>
+ 797   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 798   <span class="k">my</span><span class="s">(</span><span class="i">$Degree</span><span class="cm">,</span> <span class="i">$MaximumDegree</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 799 
+ 800   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 801   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 802   <span class="k">if</span> <span class="s">(</span>! <span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 803     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 804   <span class="s">}</span>
+ 805   <span class="i">$MaximumDegree</span> = <span class="n">0</span><span class="sc">;</span>
+ 806 
+ 807   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 808     <span class="i">$Degree</span> = <span class="i">$This</span><span class="i">-&gt;GetDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 809     <span class="k">if</span> <span class="s">(</span><span class="i">$Degree</span> &gt; <span class="i">$MaximumDegree</span><span class="s">)</span> <span class="s">{</span>
+ 810       <span class="i">$MaximumDegree</span> = <span class="i">$Degree</span><span class="sc">;</span>
+ 811     <span class="s">}</span>
+ 812   <span class="s">}</span>
+ 813   <span class="k">return</span> <span class="i">$MaximumDegree</span><span class="sc">;</span>
+ 814 <span class="s">}</span>
+ 815 
+ 816 <span class="c"># Get minimum degree in the graph...</span>
+ 817 <span class="c">#</span>
+<a name="GetMininumDegree-"></a> 818 <span class="k">sub </span><span class="m">GetMininumDegree</span> <span class="s">{</span>
+ 819   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 820   <span class="k">my</span><span class="s">(</span><span class="i">$Degree</span><span class="cm">,</span> <span class="i">$MininumDegree</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 821 
+ 822   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 823   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 824   <span class="k">if</span> <span class="s">(</span>! <span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 825     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 826   <span class="s">}</span>
+ 827   <span class="i">$MininumDegree</span> = <span class="n">99999</span><span class="sc">;</span>
+ 828 
+ 829   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 830     <span class="i">$Degree</span> = <span class="i">$This</span><span class="i">-&gt;GetDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 831     <span class="k">if</span> <span class="s">(</span><span class="i">$Degree</span> &lt; <span class="i">$MininumDegree</span><span class="s">)</span> <span class="s">{</span>
+ 832       <span class="i">$MininumDegree</span> = <span class="i">$Degree</span><span class="sc">;</span>
+ 833     <span class="s">}</span>
+ 834   <span class="s">}</span>
+ 835   <span class="k">return</span> <span class="i">$MininumDegree</span><span class="sc">;</span>
+ 836 <span class="s">}</span>
+ 837 
+ 838 <span class="c"># Is it a isolated vertex?</span>
+ 839 <span class="c">#</span>
+<a name="IsIsolatedVertex-"></a> 840 <span class="k">sub </span><span class="m">IsIsolatedVertex</span> <span class="s">{</span>
+ 841   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 842 
+ 843   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$VertexID</span><span class="s">)</span> <span class="s">{</span>
+ 844     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 845   <span class="s">}</span>
+ 846   <span class="k">if</span> <span class="s">(</span>! <span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+ 847     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 848   <span class="s">}</span>
+ 849   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetDegree</span><span class="s">(</span><span class="s">)</span> == <span class="n">0</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+ 850 <span class="s">}</span>
+ 851 
+ 852 <span class="c"># Get all isolated vertices...</span>
+ 853 <span class="c">#</span>
+<a name="GetIsolatedVertices-"></a> 854 <span class="k">sub </span><span class="m">GetIsolatedVertices</span> <span class="s">{</span>
+ 855   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 856 
+ 857   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetVerticesWithDegreeLessThan</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span>
+ 858 <span class="s">}</span>
+ 859 
+ 860 <span class="c"># Is it a leaf vertex?</span>
+ 861 <span class="c">#</span>
+<a name="IsLeafVertex-"></a> 862 <span class="k">sub </span><span class="m">IsLeafVertex</span> <span class="s">{</span>
+ 863   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 864 
+ 865   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$VertexID</span><span class="s">)</span> <span class="s">{</span>
+ 866     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 867   <span class="s">}</span>
+ 868   <span class="k">if</span> <span class="s">(</span>! <span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+ 869     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 870   <span class="s">}</span>
+ 871   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetDegree</span><span class="s">(</span><span class="s">)</span> == <span class="n">1</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+ 872 <span class="s">}</span>
+ 873 
+ 874 <span class="c"># Get all leaf vertices...</span>
+ 875 <span class="c">#</span>
+<a name="GetLeafVertices-"></a> 876 <span class="k">sub </span><span class="m">GetLeafVertices</span> <span class="s">{</span>
+ 877   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 878 
+ 879   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetVerticesWithDegreeLessThan</span><span class="s">(</span><span class="n">2</span><span class="s">)</span><span class="sc">;</span>
+ 880 <span class="s">}</span>
+ 881 
+ 882 <span class="c"># Get vertices  with degree less than a specified value...</span>
+ 883 <span class="c">#</span>
+<a name="GetVerticesWithDegreeLessThan-"></a> 884 <span class="k">sub </span><span class="m">GetVerticesWithDegreeLessThan</span> <span class="s">{</span>
+ 885   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$SpecifiedDegree</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 886   <span class="k">my</span><span class="s">(</span><span class="i">$Degree</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">@FilteredVertexIDs</span><span class="s">)</span><span class="sc">;</span>
+ 887 
+ 888   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@FilteredVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 889 
+ 890   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 891   <span class="k">if</span> <span class="s">(</span>! <span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 892     <span class="k">return</span> <span class="i">@FilteredVertexIDs</span><span class="sc">;</span>
+ 893   <span class="s">}</span>
+ 894 
+ 895   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+ 896     <span class="i">$Degree</span> = <span class="i">$This</span><span class="i">-&gt;_GetInDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span> + <span class="i">$This</span><span class="i">-&gt;_GetOutDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+ 897     <span class="k">if</span> <span class="s">(</span><span class="i">$Degree</span> &lt; <span class="i">$SpecifiedDegree</span><span class="s">)</span> <span class="s">{</span>
+ 898       <span class="k">push</span> <span class="i">@FilteredVertexIDs</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="sc">;</span>
+ 899     <span class="s">}</span>
+ 900   <span class="s">}</span>
+ 901   <span class="k">return</span> <span class="i">@FilteredVertexIDs</span><span class="sc">;</span>
+ 902 <span class="s">}</span>
+ 903 
+ 904 <span class="c"># Set a property for graph...</span>
+<a name="SetGraphProperty-"></a> 905 <span class="k">sub </span><span class="m">SetGraphProperty</span> <span class="s">{</span>
+ 906   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 907 
+ 908   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 909     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetGraphProperty: Didn&#39;t set property: Both property name and value should be specified...&quot;</span><span class="sc">;</span>
+ 910     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 911   <span class="s">}</span>
+ 912   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Graph</span>}-&gt;{<span class="i">$Name</span>}<span class="s">)</span> <span class="s">{</span>
+ 913     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetGraphProperty: Didn&#39;t set property $Name: Already exists in the graph...&quot;</span><span class="sc">;</span>
+ 914     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 915   <span class="s">}</span>
+ 916 
+ 917   <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Graph</span>}-&gt;{<span class="i">$Name</span>} = <span class="i">$Value</span><span class="sc">;</span>
+ 918 
+ 919   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 920 <span class="s">}</span>
+ 921 
+ 922 <span class="c"># Set a properties for graph...</span>
+<a name="SetGraphProperties-"></a> 923 <span class="k">sub </span><span class="m">SetGraphProperties</span> <span class="s">{</span>
+ 924   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">%NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 925 
+ 926   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">keys</span> <span class="i">%NamesAndValues</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 927     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetGraphProperties: Didn&#39;t set properties: Names and values list is empty...&quot;</span><span class="sc">;</span>
+ 928     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 929   <span class="s">}</span>
+ 930 
+ 931   <span class="k">my</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+ 932   <span class="k">while</span> <span class="s">(</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="k">each</span>  <span class="i">%NamesAndValues</span><span class="s">)</span> <span class="s">{</span>
+ 933     <span class="i">$This</span><span class="i">-&gt;SetGraphProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+ 934   <span class="s">}</span>
+ 935 
+ 936   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 937 <span class="s">}</span>
+ 938 
+ 939 <span class="c"># Get a property value for graph...</span>
+<a name="GetGraphProperty-"></a> 940 <span class="k">sub </span><span class="m">GetGraphProperty</span> <span class="s">{</span>
+ 941   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 942 
+ 943   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasGraphProperty</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 944     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 945   <span class="s">}</span>
+ 946 
+ 947   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Graph</span>}-&gt;{<span class="i">$Name</span>}<span class="sc">;</span>
+ 948 <span class="s">}</span>
+ 949 
+ 950 <span class="c"># Get all poperty name/value pairs for graph...</span>
+<a name="GetGraphProperties-"></a> 951 <span class="k">sub </span><span class="m">GetGraphProperties</span> <span class="s">{</span>
+ 952   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 953 
+ 954   <span class="k">return</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Graph</span>}}<span class="sc">;</span>
+ 955 <span class="s">}</span>
+ 956 
+ 957 <span class="c"># Delete a property for graph...</span>
+<a name="DeleteGraphProperty-"></a> 958 <span class="k">sub </span><span class="m">DeleteGraphProperty</span> <span class="s">{</span>
+ 959   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 960 
+ 961   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Name</span><span class="s">)</span> <span class="s">{</span>
+ 962     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteGraphProperty: Didn&#39;t delete graph property: Name must be specified...&quot;</span><span class="sc">;</span>
+ 963     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 964   <span class="s">}</span>
+ 965   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasGraphProperty</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 966     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt; DeleteGraphProperty: Didn&#39;t delete graph property $Name: Property doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+ 967     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+ 968   <span class="s">}</span>
+ 969   <span class="k">delete</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Graph</span>}-&gt;{<span class="i">$Name</span>}<span class="sc">;</span>
+ 970 
+ 971   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 972 <span class="s">}</span>
+ 973 
+ 974 <span class="c"># Delete graph properites...</span>
+<a name="DeleteGraphProperties-"></a> 975 <span class="k">sub </span><span class="m">DeleteGraphProperties</span> <span class="s">{</span>
+ 976   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 977 
+ 978   <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Graph</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 979 
+ 980   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 981 <span class="s">}</span>
+ 982 
+ 983 
+ 984 <span class="c"># Is this property associated with graph?</span>
+<a name="HasGraphProperty-"></a> 985 <span class="k">sub </span><span class="m">HasGraphProperty</span> <span class="s">{</span>
+ 986   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 987 
+ 988   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Name</span><span class="s">)</span> <span class="s">{</span>
+ 989     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 990   <span class="s">}</span>
+ 991   <span class="k">return</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Graph</span>}-&gt;{<span class="i">$Name</span>}<span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+ 992 <span class="s">}</span>
+ 993 
+ 994 <span class="c"># Set a property for vertex...</span>
+<a name="SetVertexProperty-"></a> 995 <span class="k">sub </span><span class="m">SetVertexProperty</span> <span class="s">{</span>
+ 996   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 997 
+ 998   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 999     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetVertexProperty: Didn&#39;t set property: Property name, value and vertexID should be specified...&quot;</span><span class="sc">;</span>
+1000     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1001   <span class="s">}</span>
+1002   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1003     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetVertexProperty: Didn&#39;t set property $Name for vertex $VertexID: Vertex doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+1004     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1005   <span class="s">}</span>
+1006   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasVertexProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1007     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetVertexProperty: Didn&#39;t set property $Name for vertex $VertexID: Property already exists...&quot;</span><span class="sc">;</span>
+1008     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1009   <span class="s">}</span>
+1010 
+1011   <span class="i">$This</span><span class="i">-&gt;_SetVertexProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+1012 
+1013   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1014 <span class="s">}</span>
+1015 
+1016 <span class="c"># Update a property for vertex...</span>
+<a name="UpdateVertexProperty-"></a>1017 <span class="k">sub </span><span class="m">UpdateVertexProperty</span> <span class="s">{</span>
+1018   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1019 
+1020   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1021     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;UpdateVextexProperty: Didn&#39;t update property: Property name, value and vertexID should be specified...&quot;</span><span class="sc">;</span>
+1022     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1023   <span class="s">}</span>
+1024   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1025     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;UpdateVextexProperty: Didn&#39;t update property $Name for vertex $VertexID: Vertex doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+1026     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1027   <span class="s">}</span>
+1028   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertexProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1029     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;UpdateVextexProperty: Didn&#39;t update property $Name for vertex $VertexID: Property doesn&#39;t exists...&quot;</span><span class="sc">;</span>
+1030     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1031   <span class="s">}</span>
+1032   <span class="i">$This</span><span class="i">-&gt;_SetVertexProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+1033 
+1034   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1035 <span class="s">}</span>
+1036 
+1037 <span class="c"># Set a vextex property...</span>
+<a name="_SetVertexProperty-"></a>1038 <span class="k">sub </span><span class="m">_SetVertexProperty</span> <span class="s">{</span>
+1039   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1040 
+1041   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+1042     <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1043   <span class="s">}</span>
+1044   <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}-&gt;{<span class="i">$Name</span>} = <span class="i">$Value</span><span class="sc">;</span>
+1045 
+1046   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1047 <span class="s">}</span>
+1048 
+1049 <span class="c"># Set a properties for vertex..</span>
+<a name="SetVertexProperties-"></a>1050 <span class="k">sub </span><span class="m">SetVertexProperties</span> <span class="s">{</span>
+1051   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">@NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1052 
+1053   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$VertexID</span><span class="s">)</span> <span class="s">{</span>
+1054     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetVertexProperties: Didn&#39;t set property: VertexID should be specified...&quot;</span><span class="sc">;</span>
+1055     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1056   <span class="s">}</span>
+1057   <span class="k">if</span> <span class="s">(</span>!<span class="i">@NamesAndValues</span><span class="s">)</span> <span class="s">{</span>
+1058     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetVertexProperties: Didn&#39;t set property: Names and values list is empty...&quot;</span><span class="sc">;</span>
+1059     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1060   <span class="s">}</span>
+1061   <span class="k">if</span> <span class="s">(</span><span class="i">@NamesAndValues</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1062     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetVertexProperties: Didn&#39;t set property: Invalid property name and values IDs data: Input list must contain even number of values...&quot;</span><span class="sc">;</span>
+1063     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1064   <span class="s">}</span>
+1065 
+1066   <span class="k">my</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
+1067   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#NamesAndValues</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1068     <span class="i">$Name</span> = <span class="i">$NamesAndValues</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$Value</span> = <span class="i">$NamesAndValues</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+1069     <span class="i">$This</span><span class="i">-&gt;SetVertexProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+1070   <span class="s">}</span>
+1071 
+1072   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1073 <span class="s">}</span>
+1074 
+1075 
+1076 <span class="c"># Set a property for vertices...</span>
+<a name="SetVerticesProperty-"></a>1077 <span class="k">sub </span><span class="m">SetVerticesProperty</span> <span class="s">{</span>
+1078   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">@ValuesAndVertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1079 
+1080   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Name</span><span class="s">)</span> <span class="s">{</span>
+1081     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetVerticesProperty: Didn&#39;t set property: Property name should be specified...&quot;</span><span class="sc">;</span>
+1082     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1083   <span class="s">}</span>
+1084   <span class="k">if</span> <span class="s">(</span>!<span class="i">@ValuesAndVertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1085     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetVerticesProperty: Didn&#39;t set property: Values and vertex IDs list is empty...&quot;</span><span class="sc">;</span>
+1086     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1087   <span class="s">}</span>
+1088   <span class="k">if</span> <span class="s">(</span><span class="i">@ValuesAndVertexIDs</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1089     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetVerticesProperty: Didn&#39;t set property: Invalid property values and vertex IDs data: Input list must contain even number of values...&quot;</span><span class="sc">;</span>
+1090     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1091   <span class="s">}</span>
+1092 
+1093   <span class="k">my</span><span class="s">(</span><span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
+1094   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#ValuesAndVertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1095     <span class="i">$Value</span> = <span class="i">$ValuesAndVertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID</span> = <span class="i">$ValuesAndVertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+1096     <span class="i">$This</span><span class="i">-&gt;SetVertexProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+1097   <span class="s">}</span>
+1098 
+1099   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1100 <span class="s">}</span>
+1101 
+1102 <span class="c"># Get a property value for vertex...</span>
+<a name="GetVertexProperty-"></a>1103 <span class="k">sub </span><span class="m">GetVertexProperty</span> <span class="s">{</span>
+1104   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1105 
+1106   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertexProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1107     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1108   <span class="s">}</span>
+1109 
+1110   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}-&gt;{<span class="i">$Name</span>}<span class="sc">;</span>
+1111 <span class="s">}</span>
+1112 
+1113 <span class="c"># Get a property values for vertices...</span>
+<a name="GetVerticesProperty-"></a>1114 <span class="k">sub </span><span class="m">GetVerticesProperty</span> <span class="s">{</span>
+1115   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1116   <span class="k">my</span><span class="s">(</span><span class="i">$ValuesCount</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+1117 
+1118   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1119     <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1120     <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1121   <span class="s">}</span>
+1122   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1123   <span class="i">@Values</span> = <span class="k">map</span> <span class="s">{</span> <span class="i">$This</span><span class="i">-&gt;GetVertexProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$_</span> <span class="s">)</span> <span class="s">}</span> <span class="i">@VertexIDs</span><span class="sc">;</span>
+1124   <span class="i">$ValuesCount</span> = <span class="k">grep</span> <span class="s">{</span> <span class="k">defined</span><span class="s">(</span><span class="i">$_</span><span class="s">)</span> <span class="s">}</span> <span class="i">@Values</span><span class="sc">;</span>
+1125 
+1126   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@Values</span> <span class="co">:</span> <span class="i">$ValuesCount</span><span class="sc">;</span>
+1127 <span class="s">}</span>
+1128 
+1129 <span class="c"># Get all property name/values pairs for vertex...</span>
+<a name="GetVertexProperties-"></a>1130 <span class="k">sub </span><span class="m">GetVertexProperties</span> <span class="s">{</span>
+1131   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1132 
+1133   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1134     <span class="k">return</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1135   <span class="s">}</span>
+1136 
+1137   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+1138     <span class="k">return</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}}<span class="sc">;</span>
+1139   <span class="s">}</span>
+1140   <span class="k">else</span> <span class="s">{</span>
+1141     <span class="k">return</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1142   <span class="s">}</span>
+1143 <span class="s">}</span>
+1144 
+1145 
+1146 <span class="c"># Delete a property for vertex...</span>
+<a name="DeleteVertexProperty-"></a>1147 <span class="k">sub </span><span class="m">DeleteVertexProperty</span> <span class="s">{</span>
+1148   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1149 
+1150   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1151     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteVertexProperty: Didn&#39;t delete property: Property name and vertex ID must be defined...&quot;</span><span class="sc">;</span>
+1152     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1153   <span class="s">}</span>
+1154   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertexProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1155     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteVertexProperty: Didn&#39;t delete property $Name for vertex $VertexID: Vertex property doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+1156     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1157   <span class="s">}</span>
+1158   <span class="i">$This</span><span class="i">-&gt;_DeleteVertexProperty</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$Name</span><span class="s">)</span><span class="sc">;</span>
+1159 
+1160   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1161 <span class="s">}</span>
+1162 
+1163 <span class="c"># Delete vertex property or all properties...</span>
+<a name="_DeleteVertexProperty-"></a>1164 <span class="k">sub </span><span class="m">_DeleteVertexProperty</span> <span class="s">{</span>
+1165   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$Name</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1166 
+1167   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+1168     <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$Name</span><span class="s">)</span> <span class="s">{</span>
+1169       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}-&gt;{<span class="i">$Name</span>}<span class="s">)</span> <span class="s">{</span>
+1170         <span class="k">delete</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}-&gt;{<span class="i">$Name</span>}<span class="sc">;</span>
+1171       <span class="s">}</span>
+1172     <span class="s">}</span>
+1173     <span class="k">else</span> <span class="s">{</span>
+1174       <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1175     <span class="s">}</span>
+1176     <span class="k">if</span> <span class="s">(</span>! <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}}<span class="s">)</span> <span class="s">{</span>
+1177       <span class="k">delete</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="sc">;</span>
+1178     <span class="s">}</span>
+1179   <span class="s">}</span>
+1180   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1181 <span class="s">}</span>
+1182 
+1183 <span class="c"># Delete a property for specified vertices or all the vertices...</span>
+<a name="DeleteVerticesProperty-"></a>1184 <span class="k">sub </span><span class="m">DeleteVerticesProperty</span> <span class="s">{</span>
+1185   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1186 
+1187   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Name</span><span class="s">)</span> <span class="s">{</span>
+1188     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteVerticesProperty: Didn&#39;t delete property: Property name should be specified...&quot;</span><span class="sc">;</span>
+1189     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1190   <span class="s">}</span>
+1191   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1192     <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1193     <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1194   <span class="s">}</span>
+1195   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+1196   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1197     <span class="i">$This</span><span class="i">-&gt;DeleteVertexProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+1198   <span class="s">}</span>
+1199 
+1200   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1201 <span class="s">}</span>
+1202 
+1203 <span class="c"># Delete all properities for vertex...</span>
+<a name="DeleteVertexProperties-"></a>1204 <span class="k">sub </span><span class="m">DeleteVertexProperties</span> <span class="s">{</span>
+1205   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1206 
+1207   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$VertexID</span><span class="s">)</span> <span class="s">{</span>
+1208     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteVertexProperties: Didn&#39;t delete properties: Vertex ID must be defined...&quot;</span><span class="sc">;</span>
+1209     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1210   <span class="s">}</span>
+1211   <span class="i">$This</span><span class="i">-&gt;_DeleteVertexProperty</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+1212 
+1213   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1214 <span class="s">}</span>
+1215 
+1216 <span class="c"># Is this property associated with vertex?</span>
+<a name="HasVertexProperty-"></a>1217 <span class="k">sub </span><span class="m">HasVertexProperty</span> <span class="s">{</span>
+1218   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1219 
+1220   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1221     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1222   <span class="s">}</span>
+1223 
+1224   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+1225     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Vertices</span>}-&gt;{<span class="i">$VertexID</span>}-&gt;{<span class="i">$Name</span>}<span class="s">)</span> <span class="s">{</span>
+1226       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1227     <span class="s">}</span>
+1228   <span class="s">}</span>
+1229   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1230 <span class="s">}</span>
+1231 
+1232 <span class="c"># Set a property for edge...</span>
+<a name="SetEdgeProperty-"></a>1233 <span class="k">sub </span><span class="m">SetEdgeProperty</span> <span class="s">{</span>
+1234   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1235 
+1236   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1237     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetEdgeProperty: Didn&#39;t set property: Property name, value, vertexID1 and vertexID2 should be specified...&quot;</span><span class="sc">;</span>
+1238     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1239   <span class="s">}</span>
+1240   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasEdge</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1241     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetEdgeProperty: Didn&#39;t set property $Name for edge between vertices $VertexID1 and $VertexID2: Edge doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+1242     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1243   <span class="s">}</span>
+1244   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1245     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetEdgeProperty: Didn&#39;t set property $Name for edge between vertices $VertexID1 and $VertexID2: Edge property already exists...&quot;</span><span class="sc">;</span>
+1246     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1247   <span class="s">}</span>
+1248   <span class="i">$This</span><span class="i">-&gt;_SetEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1249   <span class="i">$This</span><span class="i">-&gt;_SetEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="sc">;</span>
+1250 
+1251   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1252 <span class="s">}</span>
+1253 
+1254 <span class="c"># Update a property for edge...</span>
+<a name="UpdateEdgeProperty-"></a>1255 <span class="k">sub </span><span class="m">UpdateEdgeProperty</span> <span class="s">{</span>
+1256   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1257 
+1258   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1259     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;UpdateEdgeProperty: Didn&#39;t update property: Property name, value, vertexID1 and vertexID2 should be specified...&quot;</span><span class="sc">;</span>
+1260     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1261   <span class="s">}</span>
+1262   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasEdge</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1263     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;UpdateEdgeProperty: Didn&#39;t update property $Name for edge between vertices $VertexID1 and $VertexID2: Edge doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+1264     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1265   <span class="s">}</span>
+1266   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1267     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;UpdateEdgeProperty: Didn&#39;t update property $Name for edge between vertices $VertexID1 and $VertexID2: Edge property doesn&#39;t exists...&quot;</span><span class="sc">;</span>
+1268     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1269   <span class="s">}</span>
+1270   <span class="i">$This</span><span class="i">-&gt;_SetEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1271   <span class="i">$This</span><span class="i">-&gt;_SetEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="sc">;</span>
+1272 
+1273   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1274 <span class="s">}</span>
+1275 <span class="c"># Set a property for edges...</span>
+<a name="SetEdgesProperty-"></a>1276 <span class="k">sub </span><span class="m">SetEdgesProperty</span> <span class="s">{</span>
+1277   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">@ValuesAndVertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1278 
+1279   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Name</span><span class="s">)</span> <span class="s">{</span>
+1280     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetEdgesProperty: Didn&#39;t set property: Property name should be specified...&quot;</span><span class="sc">;</span>
+1281     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1282   <span class="s">}</span>
+1283   <span class="k">if</span> <span class="s">(</span>!<span class="i">@ValuesAndVertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1284     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetEdgesProperty: Didn&#39;t set property: Values and vertex IDs list is empty...&quot;</span><span class="sc">;</span>
+1285     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1286   <span class="s">}</span>
+1287   <span class="k">if</span> <span class="s">(</span><span class="i">@ValuesAndVertexIDs</span> % <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
+1288     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetEdgesProperty: Didn&#39;t set property: Invalid property values and vertex IDs data: Input list must contain triplets of values...&quot;</span><span class="sc">;</span>
+1289     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1290   <span class="s">}</span>
+1291 
+1292   <span class="k">my</span><span class="s">(</span><span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
+1293   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#ValuesAndVertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
+1294     <span class="i">$Value</span> = <span class="i">$ValuesAndVertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span>
+1295     <span class="i">$VertexID1</span> = <span class="i">$ValuesAndVertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$ValuesAndVertexIDs</span>[<span class="i">$Index</span> + <span class="n">2</span>]<span class="sc">;</span>
+1296     <span class="i">$This</span><span class="i">-&gt;SetEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1297   <span class="s">}</span>
+1298 
+1299   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1300 <span class="s">}</span>
+1301 
+1302 <span class="c"># Set a properties for a edge...</span>
+<a name="SetEdgeProperties-"></a>1303 <span class="k">sub </span><span class="m">SetEdgeProperties</span> <span class="s">{</span>
+1304   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">@NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1305 
+1306   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1307     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetEdgeProperties: Didn&#39;t set property: Both vertexID1 and vertexID2 should be specified...&quot;</span><span class="sc">;</span>
+1308     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1309   <span class="s">}</span>
+1310   <span class="k">if</span> <span class="s">(</span>!<span class="i">@NamesAndValues</span><span class="s">)</span> <span class="s">{</span>
+1311     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetEdgeProperties: Didn&#39;t set property: Property name and values ist is empty...&quot;</span><span class="sc">;</span>
+1312     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1313   <span class="s">}</span>
+1314   <span class="k">if</span> <span class="s">(</span><span class="i">@NamesAndValues</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1315     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetEdgeProperties: Didn&#39;t set property: Invalid property name and values data: Input list must contain triplets of values...&quot;</span><span class="sc">;</span>
+1316     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1317   <span class="s">}</span>
+1318 
+1319   <span class="k">my</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
+1320   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#NamesAndValues</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1321     <span class="i">$Name</span> = <span class="i">$NamesAndValues</span>[<span class="i">$Index</span>]<span class="sc">;</span>
+1322     <span class="i">$Value</span> = <span class="i">$NamesAndValues</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+1323     <span class="i">$This</span><span class="i">-&gt;SetEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1324   <span class="s">}</span>
+1325 
+1326   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1327 <span class="s">}</span>
+1328 
+1329 <span class="c"># Set edge property...</span>
+<a name="_SetEdgeProperty-"></a>1330 <span class="k">sub </span><span class="m">_SetEdgeProperty</span> <span class="s">{</span>
+1331   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1332 
+1333   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span>
+1334     <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1335   <span class="s">}</span>
+1336   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span>
+1337     <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1338   <span class="s">}</span>
+1339   <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}-&gt;{<span class="i">$Name</span>} = <span class="i">$Value</span><span class="sc">;</span>
+1340 
+1341   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1342 <span class="s">}</span>
+1343 
+1344 <span class="c"># Get a property value for edge...</span>
+<a name="GetEdgeProperty-"></a>1345 <span class="k">sub </span><span class="m">GetEdgeProperty</span> <span class="s">{</span>
+1346   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1347 
+1348   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1349     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1350   <span class="s">}</span>
+1351   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}-&gt;{<span class="i">$Name</span>}<span class="sc">;</span>
+1352 <span class="s">}</span>
+1353 
+1354 <span class="c"># Get a property values for edges...</span>
+<a name="GetEdgesProperty-"></a>1355 <span class="k">sub </span><span class="m">GetEdgesProperty</span> <span class="s">{</span>
+1356   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1357 
+1358   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1359     <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1360     <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1361   <span class="s">}</span>
+1362   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1363     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1364   <span class="s">}</span>
+1365 
+1366   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$ValuesCount</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+1367   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1368   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#VertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1369     <span class="i">$VertexID1</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+1370     <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;GetEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1371   <span class="s">}</span>
+1372   <span class="i">$ValuesCount</span> = <span class="k">grep</span> <span class="s">{</span> <span class="k">defined</span><span class="s">(</span><span class="i">$_</span><span class="s">)</span> <span class="s">}</span> <span class="i">@Values</span><span class="sc">;</span>
+1373 
+1374   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@Values</span> <span class="co">:</span> <span class="i">$ValuesCount</span><span class="sc">;</span>
+1375 <span class="s">}</span>
+1376 
+1377 <span class="c"># Get all property name/value paries for edge...</span>
+<a name="GetEdgeProperties-"></a>1378 <span class="k">sub </span><span class="m">GetEdgeProperties</span> <span class="s">{</span>
+1379   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1380 
+1381   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1382     <span class="k">return</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1383   <span class="s">}</span>
+1384   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span>
+1385     <span class="k">return</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1386   <span class="s">}</span>
+1387   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span>
+1388     <span class="k">return</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1389   <span class="s">}</span>
+1390   <span class="k">return</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}}<span class="sc">;</span>
+1391 <span class="s">}</span>
+1392 
+1393 <span class="c"># Delete a property for edge...</span>
+<a name="DeleteEdgeProperty-"></a>1394 <span class="k">sub </span><span class="m">DeleteEdgeProperty</span> <span class="s">{</span>
+1395   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1396 
+1397   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1398     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteEdgeProperty: Didn&#39;t delete property: Property name, vertexID1 and vertexID2 should be specified...&quot;</span><span class="sc">;</span>
+1399     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1400   <span class="s">}</span>
+1401   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1402     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteEdgeProperty: Didn&#39;t delete property $Name for edge between vertices $VertexID1 and $VertexID2: Edge property doesn&#39;t exist...&quot;</span><span class="sc">;</span>
+1403     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1404   <span class="s">}</span>
+1405   <span class="i">$This</span><span class="i">-&gt;_DeleteEdgeProperty</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$Name</span><span class="s">)</span><span class="sc">;</span>
+1406   <span class="i">$This</span><span class="i">-&gt;_DeleteEdgeProperty</span><span class="s">(</span><span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$Name</span><span class="s">)</span><span class="sc">;</span>
+1407 
+1408   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1409 <span class="s">}</span>
+1410 
+1411 <span class="c"># Delete a property for edges...</span>
+<a name="DeleteEdgesProperty-"></a>1412 <span class="k">sub </span><span class="m">DeleteEdgesProperty</span> <span class="s">{</span>
+1413   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1414 
+1415   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Name</span><span class="s">)</span> <span class="s">{</span>
+1416     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteEdgesProperty: Didn&#39;t delete property: Property name should be specified...&quot;</span><span class="sc">;</span>
+1417     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1418   <span class="s">}</span>
+1419   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1420     <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1421     <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1422   <span class="s">}</span>
+1423   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1424     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteEdgesProperty: Didn&#39;t set property: Invalid property values and vertex IDs data: Input list must contain even number of values...&quot;</span><span class="sc">;</span>
+1425     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1426   <span class="s">}</span>
+1427   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1428   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#VertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1429     <span class="i">$VertexID1</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+1430     <span class="i">$This</span><span class="i">-&gt;DeleteEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1431   <span class="s">}</span>
+1432 
+1433   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1434 <span class="s">}</span>
+1435 
+1436 <span class="c"># Delete all properties for edge...</span>
+<a name="DeleteEdgeProperties-"></a>1437 <span class="k">sub </span><span class="m">DeleteEdgeProperties</span> <span class="s">{</span>
+1438   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1439 
+1440   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1441     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteEdgeProperties: Didn&#39;t delete property: VertexID1 and vertexID2 should be specified...&quot;</span><span class="sc">;</span>
+1442     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1443   <span class="s">}</span>
+1444   <span class="i">$This</span><span class="i">-&gt;_DeleteEdgeProperty</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1445   <span class="i">$This</span><span class="i">-&gt;_DeleteEdgeProperty</span><span class="s">(</span><span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="sc">;</span>
+1446 
+1447   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1448 <span class="s">}</span>
+1449 
+1450 <span class="c"># Delete properties for edges...</span>
+<a name="DeleteEdgesProperties-"></a>1451 <span class="k">sub </span><span class="m">DeleteEdgesProperties</span> <span class="s">{</span>
+1452   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1453 
+1454   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1455     <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1456     <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1457   <span class="s">}</span>
+1458   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1459     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;DeleteEdgesProperty: Didn&#39;t set property: Invalid property values and vertex IDs data: Input list must contain even number of values...&quot;</span><span class="sc">;</span>
+1460     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1461   <span class="s">}</span>
+1462   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1463   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#VertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1464     <span class="i">$VertexID1</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+1465     <span class="i">$This</span><span class="i">-&gt;DeleteEdgeProperties</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1466   <span class="s">}</span>
+1467   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1468 <span class="s">}</span>
+1469 
+1470 
+1471 <span class="c"># Delete a specific edge property or all edge properties...</span>
+<a name="_DeleteEdgeProperty-"></a>1472 <span class="k">sub </span><span class="m">_DeleteEdgeProperty</span> <span class="s">{</span>
+1473   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$Name</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1474 
+1475   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span>
+1476     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span>
+1477       <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$Name</span><span class="s">)</span> <span class="s">{</span>
+1478         <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}-&gt;{<span class="i">$Name</span>}<span class="s">)</span> <span class="s">{</span>
+1479           <span class="k">delete</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}-&gt;{<span class="i">$Name</span>}<span class="sc">;</span>
+1480         <span class="s">}</span>
+1481       <span class="s">}</span>
+1482       <span class="k">else</span> <span class="s">{</span>
+1483         <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1484       <span class="s">}</span>
+1485       <span class="k">if</span> <span class="s">(</span>! <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}}<span class="s">)</span> <span class="s">{</span>
+1486         <span class="k">delete</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}<span class="sc">;</span>
+1487       <span class="s">}</span>
+1488     <span class="s">}</span>
+1489     <span class="k">if</span> <span class="s">(</span>! <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}}<span class="s">)</span> <span class="s">{</span>
+1490       <span class="k">delete</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}<span class="sc">;</span>
+1491     <span class="s">}</span>
+1492   <span class="s">}</span>
+1493 
+1494   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1495 <span class="s">}</span>
+1496 
+1497 <span class="c"># Is this property associated with edge?</span>
+<a name="HasEdgeProperty-"></a>1498 <span class="k">sub </span><span class="m">HasEdgeProperty</span> <span class="s">{</span>
+1499   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1500 
+1501   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1502     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1503   <span class="s">}</span>
+1504   <span class="k">my</span><span class="s">(</span><span class="i">$Status</span><span class="s">)</span><span class="sc">;</span>
+1505 
+1506   <span class="i">$Status</span> = <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;_HasEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> || <span class="i">$This</span><span class="i">-&gt;_HasEdgeProperty</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+1507 
+1508   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span>
+1509 <span class="s">}</span>
+1510 
+1511 <span class="c"># Does edge proprty exists?</span>
+<a name="_HasEdgeProperty-"></a>1512 <span class="k">sub </span><span class="m">_HasEdgeProperty</span> <span class="s">{</span>
+1513   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Name</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1514 
+1515   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span>
+1516     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span>
+1517       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Properties</span>}-&gt;{<span class="w">Edges</span>}-&gt;{<span class="i">$VertexID1</span>}-&gt;{<span class="i">$VertexID2</span>}-&gt;{<span class="i">$Name</span>}<span class="s">)</span> <span class="s">{</span>
+1518         <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1519       <span class="s">}</span>
+1520     <span class="s">}</span>
+1521   <span class="s">}</span>
+1522   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1523 <span class="s">}</span>
+1524 
+1525 <span class="c"># Is it a graph object?</span>
+<a name="IsGraph-"></a>1526 <span class="k">sub </span><span class="m">IsGraph ($)</span> <span class="s">{</span>
+1527   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1528 
+1529   <span class="k">return</span> <span class="i">_IsGraph</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span><span class="sc">;</span>
+1530 <span class="s">}</span>
+1531 
+1532 <span class="c"># Return a string containg vertices, edges and other properties...</span>
+<a name="StringifyGraph-"></a>1533 <span class="k">sub </span><span class="m">StringifyGraph</span> <span class="s">{</span>
+1534   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1535   <span class="k">my</span><span class="s">(</span><span class="i">$GraphString</span><span class="s">)</span><span class="sc">;</span>
+1536 
+1537   <span class="i">$GraphString</span> = <span class="q">&#39;Graph:&#39;</span> . <span class="i">$This</span><span class="i">-&gt;StringifyVerticesAndEdges</span><span class="s">(</span><span class="s">)</span> . <span class="q">&#39;; &#39;</span> . <span class="i">$This</span><span class="i">-&gt;StringifyProperties</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1538 
+1539   <span class="k">return</span> <span class="i">$GraphString</span><span class="sc">;</span>
+1540 <span class="s">}</span>
+1541 
+1542 <span class="c"># Return a string containg vertices, edges and other properties...</span>
+<a name="StringifyProperties-"></a>1543 <span class="k">sub </span><span class="m">StringifyProperties</span> <span class="s">{</span>
+1544   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1545   <span class="k">my</span><span class="s">(</span><span class="i">$PropertiesString</span><span class="s">)</span><span class="sc">;</span>
+1546 
+1547   <span class="i">$PropertiesString</span> = <span class="i">$This</span><span class="i">-&gt;StringifyGraphProperties</span><span class="s">(</span><span class="s">)</span> . <span class="q">&#39;; &#39;</span> . <span class="i">$This</span><span class="i">-&gt;StringifyVerticesProperties</span><span class="s">(</span><span class="s">)</span>. <span class="q">&#39;; &#39;</span> . <span class="i">$This</span><span class="i">-&gt;StringifyEdgesProperties</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1548 
+1549   <span class="k">return</span> <span class="i">$PropertiesString</span><span class="sc">;</span>
+1550 <span class="s">}</span>
+1551 
+1552 <span class="c"># Return a string containg vertices and edges...</span>
+<a name="StringifyVerticesAndEdges-"></a>1553 <span class="k">sub </span><span class="m">StringifyVerticesAndEdges</span> <span class="s">{</span>
+1554   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1555   <span class="k">my</span><span class="s">(</span><span class="i">$GraphString</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$Count</span><span class="cm">,</span> <span class="i">@EdgeVertexIDs</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+1556 
+1557   <span class="c"># Get vertices and edges...</span>
+1558   <span class="i">$GraphString</span> = <span class="q">&#39;&#39;</span><span class="sc">;</span>
+1559   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1560   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1561   <span class="i">$Count</span> = <span class="n">0</span><span class="sc">;</span>
+1562   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1563     <span class="i">$Count</span>++<span class="sc">;</span>
+1564     <span class="i">@EdgeVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1565     <span class="i">@EdgeVertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;_GetEdgesFrom</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+1566     <span class="k">if</span> <span class="s">(</span><span class="i">@EdgeVertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1567       <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#EdgeVertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1568         <span class="i">$VertexID1</span> = <span class="i">$EdgeVertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$EdgeVertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+1569         <span class="i">$GraphString</span> .= <span class="q">&quot; ${VertexID1}-${VertexID2}&quot;</span><span class="sc">;</span>
+1570       <span class="s">}</span>
+1571     <span class="s">}</span>
+1572     <span class="k">else</span> <span class="s">{</span>
+1573       <span class="i">$GraphString</span> .= <span class="q">&quot; ${VertexID}&quot;</span><span class="sc">;</span>
+1574     <span class="s">}</span>
+1575   <span class="s">}</span>
+1576   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Count</span><span class="s">)</span> <span class="s">{</span>
+1577     <span class="i">$GraphString</span> = <span class="q">&#39;Graph: None&#39;</span><span class="sc">;</span>
+1578   <span class="s">}</span>
+1579   <span class="k">return</span> <span class="i">$GraphString</span><span class="sc">;</span>
+1580 <span class="s">}</span>
+1581 
+1582 <span class="c"># Return a string containg graph properties...</span>
+<a name="StringifyGraphProperties-"></a>1583 <span class="k">sub </span><span class="m">StringifyGraphProperties</span> <span class="s">{</span>
+1584   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1585   <span class="k">my</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$Count</span><span class="cm">,</span> <span class="i">$GraphPropertyString</span><span class="cm">,</span> <span class="i">%GraphProperties</span><span class="s">)</span><span class="sc">;</span>
+1586 
+1587   <span class="i">$GraphPropertyString</span> = <span class="q">&quot;GraphProperties: &quot;</span><span class="sc">;</span>
+1588   <span class="i">%GraphProperties</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1589   <span class="i">%GraphProperties</span> = <span class="i">$This</span><span class="i">-&gt;GetGraphProperties</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1590   <span class="k">if</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%GraphProperties</span><span class="s">)</span> <span class="s">{</span>
+1591     <span class="k">for</span> <span class="i">$Name</span> <span class="s">(</span><span class="k">sort</span> <span class="k">keys</span> <span class="i">%GraphProperties</span><span class="s">)</span> <span class="s">{</span>
+1592       <span class="i">$Value</span> = <span class="i">$GraphProperties</span>{<span class="i">$Name</span>}<span class="sc">;</span>
+1593       <span class="k">if</span> <span class="s">(</span><span class="k">ref</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> =~ <span class="q">/^ARRAY/</span><span class="s">)</span> <span class="s">{</span>
+1594         <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$Value</span>}<span class="s">)</span> <span class="s">{</span>
+1595           <span class="i">$GraphPropertyString</span> .= <span class="q">&quot; ${Name}=(Count: &quot;</span> . <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$Value</span>} . <span class="q">&quot;; &quot;</span> . <span class="k">join</span><span class="s">(</span><span class="q">&#39;, &#39;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$Value</span>}<span class="s">)</span> .  <span class="q">&quot;)&quot;</span><span class="sc">;</span>
+1596         <span class="s">}</span>
+1597         <span class="k">else</span> <span class="s">{</span>
+1598           <span class="i">$GraphPropertyString</span> .= <span class="q">&quot; ${Name}=None&quot;</span><span class="sc">;</span>
+1599         <span class="s">}</span>
+1600       <span class="s">}</span>
+1601       <span class="k">else</span> <span class="s">{</span>
+1602         <span class="i">$GraphPropertyString</span> .= <span class="q">&quot; ${Name}=${Value}&quot;</span><span class="sc">;</span>
+1603       <span class="s">}</span>
+1604     <span class="s">}</span>
+1605   <span class="s">}</span>
+1606   <span class="k">else</span> <span class="s">{</span>
+1607     <span class="i">$GraphPropertyString</span> .= <span class="q">&quot; None&quot;</span><span class="sc">;</span>
+1608   <span class="s">}</span>
+1609   <span class="k">return</span> <span class="i">$GraphPropertyString</span><span class="sc">;</span>
+1610 <span class="s">}</span>
+1611 
+1612 <span class="c"># Return a string containg vertices  properties...</span>
+<a name="StringifyVerticesProperties-"></a>1613 <span class="k">sub </span><span class="m">StringifyVerticesProperties</span> <span class="s">{</span>
+1614   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1615   <span class="k">my</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$Count</span><span class="cm">,</span> <span class="i">$VertexPropertyString</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">%VertexProperties</span><span class="s">)</span><span class="sc">;</span>
+1616 
+1617   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1618   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1619   <span class="i">$Count</span> = <span class="n">0</span><span class="sc">;</span>
+1620   <span class="i">$VertexPropertyString</span> = <span class="q">&quot;VertexProperties:&quot;</span><span class="sc">;</span>
+1621   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1622     <span class="i">%VertexProperties</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1623     <span class="i">%VertexProperties</span> = <span class="i">$This</span><span class="i">-&gt;GetVertexProperties</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+1624     <span class="k">if</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%VertexProperties</span><span class="s">)</span> <span class="s">{</span>
+1625       <span class="i">$Count</span>++<span class="sc">;</span>
+1626       <span class="i">$VertexPropertyString</span> .= <span class="q">&quot; &lt;Vertex ${VertexID}: &quot;</span><span class="sc">;</span>
+1627       <span class="k">for</span> <span class="i">$Name</span> <span class="s">(</span><span class="k">sort</span> <span class="k">keys</span> <span class="i">%VertexProperties</span><span class="s">)</span> <span class="s">{</span>
+1628         <span class="i">$Value</span> = <span class="i">$VertexProperties</span>{<span class="i">$Name</span>}<span class="sc">;</span>
+1629         <span class="k">if</span> <span class="s">(</span><span class="k">ref</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> =~ <span class="q">/^ARRAY/</span><span class="s">)</span> <span class="s">{</span>
+1630           <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$Value</span>}<span class="s">)</span> <span class="s">{</span>
+1631             <span class="i">$VertexPropertyString</span> .= <span class="q">&quot; ${Name}=(&quot;</span> . <span class="k">join</span><span class="s">(</span><span class="q">&#39;, &#39;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$Value</span>}<span class="s">)</span> .  <span class="q">&quot;)&quot;</span><span class="sc">;</span>
+1632           <span class="s">}</span>
+1633           <span class="k">else</span> <span class="s">{</span>
+1634             <span class="i">$VertexPropertyString</span> .= <span class="q">&quot; ${Name}=None&quot;</span><span class="sc">;</span>
+1635           <span class="s">}</span>
+1636         <span class="s">}</span>
+1637         <span class="k">else</span> <span class="s">{</span>
+1638           <span class="i">$VertexPropertyString</span> .= <span class="q">&quot; ${Name}=${Value}&quot;</span><span class="sc">;</span>
+1639         <span class="s">}</span>
+1640       <span class="s">}</span>
+1641       <span class="i">$VertexPropertyString</span> .= <span class="q">&quot;&gt;&quot;</span><span class="sc">;</span>
+1642     <span class="s">}</span>
+1643   <span class="s">}</span>
+1644   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Count</span><span class="s">)</span> <span class="s">{</span>
+1645     <span class="i">$VertexPropertyString</span> = <span class="q">&quot;VertexProperties: None&quot;</span><span class="sc">;</span>
+1646   <span class="s">}</span>
+1647   <span class="k">return</span> <span class="i">$VertexPropertyString</span><span class="sc">;</span>
+1648 <span class="s">}</span>
+1649 
+1650 <span class="c"># Return a string containg edges properties...</span>
+<a name="StringifyEdgesProperties-"></a>1651 <span class="k">sub </span><span class="m">StringifyEdgesProperties</span> <span class="s">{</span>
+1652   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1653   <span class="k">my</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$EdgePropertyString</span><span class="cm">,</span> <span class="i">$Count</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">@EdgesVertexIDs</span><span class="cm">,</span> <span class="i">%EdgeProperties</span><span class="s">)</span><span class="sc">;</span>
+1654 
+1655   <span class="i">@EdgesVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1656   <span class="i">@EdgesVertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1657   <span class="i">$Count</span> = <span class="n">0</span><span class="sc">;</span>
+1658   <span class="i">$EdgePropertyString</span> = <span class="q">&quot;EdgeProperties:&quot;</span><span class="sc">;</span>
+1659   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#EdgesVertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1660     <span class="i">$VertexID1</span> = <span class="i">$EdgesVertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$EdgesVertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+1661     <span class="i">%EdgeProperties</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1662     <span class="i">%EdgeProperties</span> = <span class="i">$This</span><span class="i">-&gt;GetEdgeProperties</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1663     <span class="k">if</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%EdgeProperties</span><span class="s">)</span> <span class="s">{</span>
+1664       <span class="i">$Count</span>++<span class="sc">;</span>
+1665       <span class="i">$EdgePropertyString</span> .= <span class="q">&quot; &lt;Edge ${VertexID1}-${VertexID2}:&quot;</span><span class="sc">;</span>
+1666       <span class="k">for</span> <span class="i">$Name</span> <span class="s">(</span><span class="k">sort</span> <span class="k">keys</span> <span class="i">%EdgeProperties</span><span class="s">)</span> <span class="s">{</span>
+1667         <span class="i">$Value</span> = <span class="i">$EdgeProperties</span>{<span class="i">$Name</span>}<span class="sc">;</span>
+1668         <span class="k">if</span> <span class="s">(</span><span class="k">ref</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> =~ <span class="q">/^ARRAY/</span><span class="s">)</span> <span class="s">{</span>
+1669           <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$Value</span>}<span class="s">)</span> <span class="s">{</span>
+1670             <span class="i">$EdgePropertyString</span> .= <span class="q">&quot; ${Name}=(&quot;</span> . <span class="k">join</span><span class="s">(</span><span class="q">&#39;, &#39;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$Value</span>}<span class="s">)</span> .  <span class="q">&quot;)&quot;</span><span class="sc">;</span>
+1671           <span class="s">}</span>
+1672           <span class="k">else</span> <span class="s">{</span>
+1673             <span class="i">$EdgePropertyString</span> .= <span class="q">&quot; ${Name}=None&quot;</span><span class="sc">;</span>
+1674           <span class="s">}</span>
+1675         <span class="s">}</span>
+1676         <span class="k">else</span> <span class="s">{</span>
+1677           <span class="i">$EdgePropertyString</span> .= <span class="q">&quot; ${Name}=${Value}&quot;</span><span class="sc">;</span>
+1678         <span class="s">}</span>
+1679       <span class="s">}</span>
+1680       <span class="i">$EdgePropertyString</span> .= <span class="q">&quot;&gt;&quot;</span><span class="sc">;</span>
+1681     <span class="s">}</span>
+1682   <span class="s">}</span>
+1683   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Count</span><span class="s">)</span> <span class="s">{</span>
+1684     <span class="i">$EdgePropertyString</span> = <span class="q">&quot;EdgeProperties: None&quot;</span><span class="sc">;</span>
+1685   <span class="s">}</span>
+1686 
+1687   <span class="k">return</span> <span class="i">$EdgePropertyString</span><span class="sc">;</span>
+1688 <span class="s">}</span>
+1689 
+1690 <span class="c"># Is it a graph object?</span>
+<a name="_IsGraph-"></a>1691 <span class="k">sub </span><span class="m">_IsGraph</span> <span class="s">{</span>
+1692   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1693 
+1694   <span class="k">return</span> <span class="s">(</span><span class="i">Scalar::Util::blessed</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> &amp;&amp; <span class="i">$Object</span><span class="i">-&gt;isa</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+1695 <span class="s">}</span>
+1696 
+1697 <span class="c"># Copy graph and its associated data using Storable::dclone and return a new graph...</span>
+1698 <span class="c">#</span>
+<a name="Copy-"></a>1699 <span class="k">sub </span><span class="m">Copy</span> <span class="s">{</span>
+1700   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1701   <span class="k">my</span><span class="s">(</span><span class="i">$NewGraph</span><span class="s">)</span><span class="sc">;</span>
+1702 
+1703   <span class="i">$NewGraph</span> = <span class="i">Storable::dclone</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+1704 
+1705   <span class="k">return</span> <span class="i">$NewGraph</span><span class="sc">;</span>
+1706 <span class="s">}</span>
+1707 
+1708 <span class="c"># Copy vertrices and edges from This graph to NewGraph specified...</span>
+1709 <span class="c">#</span>
+<a name="CopyVerticesAndEdges-"></a>1710 <span class="k">sub </span><span class="m">CopyVerticesAndEdges</span> <span class="s">{</span>
+1711   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NewGraph</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1712 
+1713   <span class="c"># Copy vertices and edges...</span>
+1714   <span class="k">my</span><span class="s">(</span><span class="i">@Vertices</span><span class="cm">,</span> <span class="i">@Edges</span><span class="s">)</span><span class="sc">;</span>
+1715   <span class="i">@Vertices</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1716   <span class="k">if</span> <span class="s">(</span><span class="i">@Vertices</span><span class="s">)</span> <span class="s">{</span>
+1717     <span class="i">$NewGraph</span><span class="i">-&gt;AddVertices</span><span class="s">(</span><span class="i">@Vertices</span><span class="s">)</span><span class="sc">;</span>
+1718   <span class="s">}</span>
+1719   <span class="i">@Edges</span> = <span class="i">$This</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1720   <span class="k">if</span> <span class="s">(</span><span class="i">@Edges</span><span class="s">)</span> <span class="s">{</span>
+1721     <span class="i">$NewGraph</span><span class="i">-&gt;AddEdges</span><span class="s">(</span><span class="i">@Edges</span><span class="s">)</span><span class="sc">;</span>
+1722   <span class="s">}</span>
+1723 
+1724   <span class="k">return</span> <span class="i">$NewGraph</span><span class="sc">;</span>
+1725 <span class="s">}</span>
+1726 
+1727 <span class="c"># Copy properties of vertices from This graph to NewGraph specified...</span>
+1728 <span class="c">#</span>
+<a name="CopyVerticesProperties-"></a>1729 <span class="k">sub </span><span class="m">CopyVerticesProperties</span> <span class="s">{</span>
+1730   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NewGraph</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1731 
+1732   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">%VertexProperties</span><span class="s">)</span><span class="sc">;</span>
+1733   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1734   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1735   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1736     <span class="i">%VertexProperties</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">%VertexProperties</span> = <span class="i">$This</span><span class="i">-&gt;GetVertexProperties</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+1737     <span class="k">if</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%VertexProperties</span><span class="s">)</span> <span class="s">{</span>
+1738       <span class="i">$NewGraph</span><span class="i">-&gt;SetVertexProperties</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">%VertexProperties</span><span class="s">)</span><span class="sc">;</span>
+1739     <span class="s">}</span>
+1740   <span class="s">}</span>
+1741   <span class="k">return</span> <span class="i">$NewGraph</span><span class="sc">;</span>
+1742 <span class="s">}</span>
+1743 
+1744 <span class="c"># Copy properties of edges from This graph to NewGraph specified...</span>
+1745 <span class="c">#</span>
+<a name="CopyEdgesProperties-"></a>1746 <span class="k">sub </span><span class="m">CopyEdgesProperties</span> <span class="s">{</span>
+1747   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NewGraph</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1748 
+1749   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">@EdgesVertexIDs</span><span class="cm">,</span> <span class="i">%EdgeProperties</span><span class="s">)</span><span class="sc">;</span>
+1750   <span class="i">@EdgesVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1751   <span class="i">@EdgesVertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1752   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#EdgesVertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1753     <span class="i">$VertexID1</span> = <span class="i">$EdgesVertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$EdgesVertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+1754     <span class="i">%EdgeProperties</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">%EdgeProperties</span> = <span class="i">$This</span><span class="i">-&gt;GetEdgeProperties</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1755     <span class="k">if</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%EdgeProperties</span><span class="s">)</span> <span class="s">{</span>
+1756       <span class="i">$NewGraph</span><span class="i">-&gt;SetEdgeProperties</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">%EdgeProperties</span><span class="s">)</span><span class="sc">;</span>
+1757     <span class="s">}</span>
+1758   <span class="s">}</span>
+1759   <span class="k">return</span> <span class="i">$NewGraph</span><span class="sc">;</span>
+1760 <span class="s">}</span>
+1761 
+1762 <span class="c"># Detect cycles and associate &#39;em to graph as graph property...</span>
+1763 <span class="c">#</span>
+1764 <span class="c"># Note:</span>
+1765 <span class="c">#   . CyclesDetection class detects all cycles in the graph and filters &#39;em to find</span>
+1766 <span class="c">#     independent cycles.</span>
+1767 <span class="c">#   . All cycles related methods in the graph operate on active cyclic paths. By default,</span>
+1768 <span class="c">#     active cyclic paths correspond to independent cycles. This behavior can be changed</span>
+1769 <span class="c">#     using SetActiveCyclicPaths method.</span>
+1770 <span class="c">#   . For topologically complex graphs containing large number of cycles, DetectCycles method</span>
+1771 <span class="c">#     implemented in CyclesDetection can time out in which case no cycles are detected or</span>
+1772 <span class="c">#     assigned.</span>
+1773 <span class="c">#</span>
+<a name="DetectCycles-"></a>1774 <span class="k">sub </span><span class="m">DetectCycles</span> <span class="s">{</span>
+1775   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1776   <span class="k">my</span><span class="s">(</span><span class="i">$CyclesDetection</span><span class="s">)</span><span class="sc">;</span>
+1777 
+1778   <span class="c"># Delete existing graph cycles...</span>
+1779   <span class="i">$This</span><span class="i">-&gt;_DeleteCyclesAssociatedWithGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1780 
+1781   <span class="c"># Detect cycles...</span>
+1782   <span class="i">$CyclesDetection</span> = <span class="i">new</span> <span class="i">Graph::CyclesDetection</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+1783   <span class="k">if</span> <span class="s">(</span>!<span class="i">$CyclesDetection</span><span class="i">-&gt;DetectCycles</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1784     <span class="c"># Cycles detection didn&#39;t finish...</span>
+1785     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1786   <span class="s">}</span>
+1787 
+1788   <span class="c"># Get cycles and associate &#39;em to graph as properties...</span>
+1789   <span class="k">my</span><span class="s">(</span><span class="i">@AllCyclicPaths</span><span class="cm">,</span> <span class="i">@IndependentCyclicPaths</span><span class="s">)</span><span class="sc">;</span>
+1790   <span class="i">@AllCyclicPaths</span> = <span class="i">$CyclesDetection</span><span class="i">-&gt;GetAllCyclicPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1791   <span class="i">@IndependentCyclicPaths</span> = <span class="i">$CyclesDetection</span><span class="i">-&gt;GetIndependentCyclicPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1792 
+1793   <span class="i">$This</span><span class="i">-&gt;SetGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> \<span class="i">@IndependentCyclicPaths</span><span class="s">)</span><span class="sc">;</span>
+1794   <span class="i">$This</span><span class="i">-&gt;SetGraphProperty</span><span class="s">(</span><span class="q">&#39;AllCyclicPaths&#39;</span><span class="cm">,</span> \<span class="i">@AllCyclicPaths</span><span class="s">)</span><span class="sc">;</span>
+1795   <span class="i">$This</span><span class="i">-&gt;SetGraphProperty</span><span class="s">(</span><span class="q">&#39;IndependentCyclicPaths&#39;</span><span class="cm">,</span> \<span class="i">@IndependentCyclicPaths</span><span class="s">)</span><span class="sc">;</span>
+1796 
+1797   <span class="c"># Map cycles information to vertices and edges; identify fused cycles as well...</span>
+1798   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_ProcessDetectedCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1799 <span class="s">}</span>
+1800 
+1801 <span class="c"># Delete any cycle properties assigned to graph, vertices and edges during detect cycles operation...</span>
+1802 <span class="c">#</span>
+<a name="ClearCycles-"></a>1803 <span class="k">sub </span><span class="m">ClearCycles</span> <span class="s">{</span>
+1804   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1805 
+1806   <span class="c"># Delete cycle properties associated with graph...</span>
+1807   <span class="i">$This</span><span class="i">-&gt;_DeleteCyclesAssociatedWithGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1808   <span class="i">$This</span><span class="i">-&gt;_DeleteFusedCyclesAssociatedWithGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1809 
+1810   <span class="c"># Delete cycle properties associated with vertices and edges...</span>
+1811   <span class="i">$This</span><span class="i">-&gt;_DeleteCyclesAssociatedWithVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1812   <span class="i">$This</span><span class="i">-&gt;_DeleteCyclesAssociatedWithEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1813 
+1814   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1815 <span class="s">}</span>
+1816 
+1817 <span class="c"># Setup cyclic paths to use during all cycle related methods. Possible values:</span>
+1818 <span class="c"># Independent or All. Default is to use Independent cyclic paths.</span>
+1819 <span class="c">#</span>
+<a name="SetActiveCyclicPaths-"></a>1820 <span class="k">sub </span><span class="m">SetActiveCyclicPaths</span> <span class="s">{</span>
+1821   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$CyclicPathsType</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1822 
+1823   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$CyclicPathsType</span><span class="s">)</span> <span class="s">{</span>
+1824     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetActiveCyclicPaths: Didn&#39;t set active cyclic path: Cyclic path must be specified...&quot;</span><span class="sc">;</span>
+1825     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1826   <span class="s">}</span>
+1827   <span class="k">if</span> <span class="s">(</span><span class="i">$CyclicPathsType</span> !~ <span class="q">/^(Independent|All)$/i</span><span class="s">)</span> <span class="s">{</span>
+1828     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetActiveCyclicPaths: Didn&#39;t set active cyclic path: Specified path type, $CyclicPathsType, is not valid. Supported valeus: Independent or All...&quot;</span><span class="sc">;</span>
+1829     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1830   <span class="s">}</span>
+1831   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1832     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;SetActiveCyclicPaths: Didn&#39;t set active cyclic path: Cycles haven&#39;t been detected yet...&quot;</span><span class="sc">;</span>
+1833     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+1834   <span class="s">}</span>
+1835   <span class="i">$This</span><span class="i">-&gt;DeleteGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span>
+1836 
+1837   <span class="k">my</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span><span class="sc">;</span>
+1838   <span class="k">if</span> <span class="s">(</span><span class="i">$CyclicPathsType</span> =~ <span class="q">/^Independent$/i</span><span class="s">)</span> <span class="s">{</span>
+1839     <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetGraphProperty</span><span class="s">(</span><span class="q">&#39;IndependentCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span>
+1840   <span class="s">}</span>
+1841   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CyclicPathsType</span> =~ <span class="q">/^All$/i</span><span class="s">)</span> <span class="s">{</span>
+1842     <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetGraphProperty</span><span class="s">(</span><span class="q">&#39;AllCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span>
+1843   <span class="s">}</span>
+1844   <span class="i">$This</span><span class="i">-&gt;SetGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span><span class="sc">;</span>
+1845 
+1846   <span class="c"># Map cycles information to vertices and edges; identify fused cycles as well...</span>
+1847   <span class="i">$This</span><span class="i">-&gt;_ProcessDetectedCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1848 
+1849   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1850 <span class="s">}</span>
+1851 
+1852 <span class="c"># Assign cycles information on to vertices and edges as vertex edge properties properties;</span>
+1853 <span class="c"># identify fused cycles as well...</span>
+1854 <span class="c">#</span>
+<a name="_ProcessDetectedCycles-"></a>1855 <span class="k">sub </span><span class="m">_ProcessDetectedCycles</span> <span class="s">{</span>
+1856   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1857 
+1858   <span class="i">$This</span><span class="i">-&gt;_AssociateCyclesWithVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1859   <span class="i">$This</span><span class="i">-&gt;_AssociateCyclesWithEdgesAndIdentifyFusedCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1860 
+1861   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1862 <span class="s">}</span>
+1863 
+1864 <span class="c"># Associate cycles information to vertices as vertex properties...</span>
+1865 <span class="c">#</span>
+<a name="_AssociateCyclesWithVertices-"></a>1866 <span class="k">sub </span><span class="m">_AssociateCyclesWithVertices</span> <span class="s">{</span>
+1867   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1868 
+1869   <span class="c"># Clear up any exisiting properties...</span>
+1870   <span class="i">$This</span><span class="i">-&gt;_DeleteCyclesAssociatedWithVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1871 
+1872   <span class="c"># Collects CyclicPaths for each vertex...</span>
+1873   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$ActiveCyclicPath</span><span class="cm">,</span> <span class="i">$ActiveCyclicPathsRef</span><span class="cm">,</span> <span class="i">@CyclicPathVertexIDs</span><span class="cm">,</span> <span class="i">%VertexIDToCylicPaths</span><span class="s">)</span><span class="sc">;</span>
+1874 
+1875   <span class="i">%VertexIDToCylicPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1876   <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span>
+1877 
+1878   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+1879     <span class="c"># No cycles out there...</span>
+1880     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1881   <span class="s">}</span>
+1882 
+1883   <span class="k">for</span> <span class="i">$ActiveCyclicPath</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+1884     <span class="i">@CyclicPathVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1885     <span class="i">@CyclicPathVertexIDs</span> = <span class="i">$ActiveCyclicPath</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1886     <span class="c"># Take out end vertex: It&#39;s same as start vertex for cyclic path...</span>
+1887     <span class="k">pop</span> <span class="i">@CyclicPathVertexIDs</span><span class="sc">;</span>
+1888     <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@CyclicPathVertexIDs</span><span class="s">)</span> <span class="s">{</span>
+1889       <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$VertexIDToCylicPaths</span>{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
+1890         <span class="i">@</span>{<span class="i">$VertexIDToCylicPaths</span>{<span class="i">$VertexID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1891       <span class="s">}</span>
+1892       <span class="k">push</span> <span class="i">@</span>{<span class="i">$VertexIDToCylicPaths</span>{<span class="i">$VertexID</span>}}<span class="cm">,</span> <span class="i">$ActiveCyclicPath</span><span class="sc">;</span>
+1893     <span class="s">}</span>
+1894   <span class="s">}</span>
+1895 
+1896   <span class="c"># Associate CyclicPaths to vertices...</span>
+1897   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%VertexIDToCylicPaths</span><span class="s">)</span> <span class="s">{</span>
+1898     <span class="i">$This</span><span class="i">-&gt;SetVertexProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> \<span class="i">@</span>{<span class="i">$VertexIDToCylicPaths</span>{<span class="i">$VertexID</span>}}<span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+1899   <span class="s">}</span>
+1900   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1901 <span class="s">}</span>
+1902 
+1903 <span class="c"># Associate cycles information to edges as edge properties and identify fused</span>
+1904 <span class="c"># cycles...</span>
+1905 <span class="c">#</span>
+<a name="_AssociateCyclesWithEdgesAndIdentifyFusedCycles-"></a>1906 <span class="k">sub </span><span class="m">_AssociateCyclesWithEdgesAndIdentifyFusedCycles</span> <span class="s">{</span>
+1907   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1908 
+1909   <span class="c"># Delete existing cycles...</span>
+1910   <span class="i">$This</span><span class="i">-&gt;_DeleteCyclesAssociatedWithEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1911   <span class="i">$This</span><span class="i">-&gt;_DeleteFusedCyclesAssociatedWithGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1912 
+1913   <span class="c"># Collect cyclic paths for each edge...</span>
+1914   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$ActiveCyclicPath</span><span class="cm">,</span> <span class="i">$ActiveCyclicPathsRef</span><span class="cm">,</span> <span class="i">$EdgeID</span><span class="cm">,</span> <span class="i">$EdgeIDDelimiter</span><span class="cm">,</span> <span class="i">$CyclesWithCommonEdgesPresent</span><span class="cm">,</span> <span class="i">@CyclicPathEdgeVertexIDs</span><span class="cm">,</span> <span class="i">%EdgeIDToCylicPaths</span><span class="s">)</span><span class="sc">;</span>
+1915 
+1916   <span class="i">%EdgeIDToCylicPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1917   <span class="i">$EdgeIDDelimiter</span> = <span class="q">&quot;~&quot;</span><span class="sc">;</span>
+1918   <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span>
+1919 
+1920   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+1921     <span class="c"># No cycles out there...</span>
+1922     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1923   <span class="s">}</span>
+1924 
+1925   <span class="i">$CyclesWithCommonEdgesPresent</span> = <span class="n">0</span><span class="sc">;</span>
+1926   <span class="k">for</span> <span class="i">$ActiveCyclicPath</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+1927     <span class="i">@CyclicPathEdgeVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1928     <span class="i">@CyclicPathEdgeVertexIDs</span> = <span class="i">$ActiveCyclicPath</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1929     <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#CyclicPathEdgeVertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+1930       <span class="i">$VertexID1</span> = <span class="i">$CyclicPathEdgeVertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$CyclicPathEdgeVertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+1931       <span class="i">$EdgeID</span> = <span class="s">(</span><span class="i">$VertexID1</span> &lt; <span class="i">$VertexID2</span><span class="s">)</span> ? <span class="q">&quot;${VertexID1}${EdgeIDDelimiter}${VertexID2}&quot;</span> <span class="co">:</span> <span class="q">&quot;${VertexID2}${EdgeIDDelimiter}${VertexID1}&quot;</span><span class="sc">;</span>
+1932       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$EdgeIDToCylicPaths</span>{<span class="i">$EdgeID</span>}<span class="s">)</span> <span class="s">{</span>
+1933         <span class="c"># A common edge between two cycles indicates a potential fused cycle...</span>
+1934         <span class="i">$CyclesWithCommonEdgesPresent</span> = <span class="n">1</span><span class="sc">;</span>
+1935       <span class="s">}</span>
+1936       <span class="k">else</span> <span class="s">{</span>
+1937         <span class="i">@</span>{<span class="i">$EdgeIDToCylicPaths</span>{<span class="i">$EdgeID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1938       <span class="s">}</span>
+1939       <span class="k">push</span> <span class="i">@</span>{<span class="i">$EdgeIDToCylicPaths</span>{<span class="i">$EdgeID</span>}}<span class="cm">,</span> <span class="i">$ActiveCyclicPath</span><span class="sc">;</span>
+1940     <span class="s">}</span>
+1941   <span class="s">}</span>
+1942 
+1943   <span class="c"># Associate CyclicPaths with edges...</span>
+1944   <span class="k">for</span> <span class="i">$EdgeID</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%EdgeIDToCylicPaths</span><span class="s">)</span> <span class="s">{</span>
+1945     <span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="k">split</span><span class="s">(</span><span class="i">$EdgeIDDelimiter</span><span class="cm">,</span> <span class="i">$EdgeID</span><span class="s">)</span><span class="sc">;</span>
+1946     <span class="i">$This</span><span class="i">-&gt;SetEdgeProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> \<span class="i">@</span>{<span class="i">$EdgeIDToCylicPaths</span>{<span class="i">$EdgeID</span>}}<span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+1947   <span class="s">}</span>
+1948 
+1949   <span class="k">if</span> <span class="s">(</span><span class="i">$CyclesWithCommonEdgesPresent</span><span class="s">)</span> <span class="s">{</span>
+1950     <span class="c"># Identify fused cycles...</span>
+1951     <span class="i">$This</span><span class="i">-&gt;_IdentifyAndAssociateFusedCyclesWithGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1952   <span class="s">}</span>
+1953 
+1954   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1955 <span class="s">}</span>
+1956 
+1957 <span class="c"># Identify fused cycles and associate them to graph as graph property after cycles</span>
+1958 <span class="c"># have been associated with edges...</span>
+1959 <span class="c">#</span>
+1960 <span class="c"># Note:</span>
+1961 <span class="c">#   . During aromaticity detection, fused cycles are treated as one set for counting</span>
+1962 <span class="c">#     number of available pi electrons to check against Huckel&#39;s rule.</span>
+1963 <span class="c">#   . Fused cylce sets contain cycles with at least one common edge between pair</span>
+1964 <span class="c">#     of cycles. A specific pair of cycles might not have a direct common edge, but</span>
+1965 <span class="c">#     ends up in the same set due to a common edge with another cycle.</span>
+1966 <span class="c">#   . Fused cycles are attached to graph as &#39;FusedActiveCyclicPaths&#39; property with</span>
+1967 <span class="c">#     its value as a reference to list of reference where each refernece corresponds</span>
+1968 <span class="c">#     to a list of cyclic path objects in a fused set.</span>
+1969 <span class="c">#   . For graphs containing fused cycles, non-fused cycles are separeted from fused</span>
+1970 <span class="c">#     cycles and attached to the graph as &#39;NonFusedActiveCyclicPaths&#39;. It&#39;s a reference</span>
+1971 <span class="c">#     to list containing cylic path objects.</span>
+1972 <span class="c">#</span>
+<a name="_IdentifyAndAssociateFusedCyclesWithGraph-"></a>1973 <span class="k">sub </span><span class="m">_IdentifyAndAssociateFusedCyclesWithGraph</span> <span class="s">{</span>
+1974   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1975 
+1976   <span class="c"># Delete exisiting fused and non-fused cycles...</span>
+1977   <span class="i">$This</span><span class="i">-&gt;_DeleteFusedCyclesAssociatedWithGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1978 
+1979   <span class="k">my</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span><span class="sc">;</span>
+1980   <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span>
+1981   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+1982     <span class="c"># No cycles out there...</span>
+1983     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1984   <span class="s">}</span>
+1985 
+1986   <span class="c"># Get fused cycle pairs...</span>
+1987   <span class="k">my</span><span class="s">(</span><span class="i">$FusedCyclePairsRef</span><span class="cm">,</span> <span class="i">$FusedCyclesRef</span><span class="cm">,</span> <span class="i">$InValidFusedCycleRef</span><span class="s">)</span><span class="sc">;</span>
+1988   <span class="s">(</span><span class="i">$FusedCyclePairsRef</span><span class="cm">,</span> <span class="i">$FusedCyclesRef</span><span class="cm">,</span> <span class="i">$InValidFusedCycleRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;_GetFusedCyclePairs</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span><span class="sc">;</span>
+1989 
+1990   <span class="c"># Get fused cycle set indices...</span>
+1991   <span class="k">my</span><span class="s">(</span><span class="i">$FusedCycleSetsIndicesRef</span><span class="cm">,</span> <span class="i">$FusedCycleSetsCommonEdgesRef</span><span class="s">)</span><span class="sc">;</span>
+1992   <span class="i">$FusedCycleSetsIndicesRef</span> = <span class="i">$This</span><span class="i">-&gt;_GetFusedCycleSetsIndices</span><span class="s">(</span><span class="i">$FusedCyclePairsRef</span><span class="cm">,</span> <span class="i">$FusedCyclesRef</span><span class="s">)</span><span class="sc">;</span>
+1993   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$FusedCycleSetsIndicesRef</span>}<span class="s">)</span> <span class="s">{</span>
+1994     <span class="c"># No fused cycles out there...</span>
+1995     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1996   <span class="s">}</span>
+1997 
+1998   <span class="c"># Get fused and non-fused cycles...</span>
+1999   <span class="k">my</span><span class="s">(</span><span class="i">$FusedCycleSetsRef</span><span class="cm">,</span> <span class="i">$NonFusedCyclesRef</span><span class="s">)</span><span class="sc">;</span>
+2000   <span class="s">(</span><span class="i">$FusedCycleSetsRef</span><span class="cm">,</span> <span class="i">$NonFusedCyclesRef</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;_GetFusedAndNonFusedCycles</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="cm">,</span> <span class="i">$FusedCycleSetsIndicesRef</span><span class="cm">,</span> <span class="i">$InValidFusedCycleRef</span><span class="s">)</span><span class="sc">;</span>
+2001   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$FusedCycleSetsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2002     <span class="c"># No fused cycles out there...</span>
+2003     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+2004   <span class="s">}</span>
+2005 
+2006   <span class="c"># Associate fused and non fused cycles to graph....</span>
+2007   <span class="i">$This</span><span class="i">-&gt;SetGraphProperty</span><span class="s">(</span><span class="q">&#39;FusedActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$FusedCycleSetsRef</span><span class="s">)</span><span class="sc">;</span>
+2008   <span class="i">$This</span><span class="i">-&gt;SetGraphProperty</span><span class="s">(</span><span class="q">&#39;NonFusedActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$NonFusedCyclesRef</span><span class="s">)</span><span class="sc">;</span>
+2009 
+2010   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+2011 <span class="s">}</span>
+2012 
+2013 <span class="c"># Collect fused cycle pairs...</span>
+2014 <span class="c">#</span>
+<a name="_GetFusedCyclePairs-"></a>2015 <span class="k">sub </span><span class="m">_GetFusedCyclePairs</span> <span class="s">{</span>
+2016   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2017 
+2018   <span class="c"># Setup a CyclicPathID to CyclicPathIndex map...</span>
+2019   <span class="k">my</span><span class="s">(</span><span class="i">$CyclicPathIndex</span><span class="cm">,</span> <span class="i">$CyclicPathID</span><span class="cm">,</span> <span class="i">$ActiveCyclicPath</span><span class="cm">,</span> <span class="i">%CyclicPathIDToIndex</span><span class="s">)</span><span class="sc">;</span>
+2020 
+2021   <span class="i">%CyclicPathIDToIndex</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2022   <span class="k">for</span> <span class="i">$CyclicPathIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2023     <span class="i">$ActiveCyclicPath</span> = <span class="i">$ActiveCyclicPathsRef</span>-&gt;[<span class="i">$CyclicPathIndex</span>]<span class="sc">;</span>
+2024     <span class="i">$CyclicPathID</span> = <span class="q">&quot;$ActiveCyclicPath&quot;</span><span class="sc">;</span>
+2025     <span class="i">$CyclicPathIDToIndex</span>{<span class="i">$CyclicPathID</span>} = <span class="i">$CyclicPathIndex</span><span class="sc">;</span>
+2026   <span class="s">}</span>
+2027   <span class="c"># Go over cycle edges and collect fused cycle pairs...</span>
+2028   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$EdgeCyclicPathsRef</span><span class="cm">,</span> <span class="i">$EdgeID</span><span class="cm">,</span> <span class="i">$CyclicPath1</span><span class="cm">,</span> <span class="i">$CyclicPath2</span><span class="cm">,</span> <span class="i">$CyclicPathID1</span><span class="cm">,</span> <span class="i">$CyclicPathID2</span><span class="cm">,</span> <span class="i">$FusedCyclePairID</span><span class="cm">,</span> <span class="i">$FusedCyclicPath1</span><span class="cm">,</span> <span class="i">$FusedCyclicPath2</span><span class="cm">,</span> <span class="i">$FusedCyclicPathID1</span><span class="cm">,</span> <span class="i">$FusedCyclicPathID2</span><span class="cm">,</span> <span class="i">$FusedCyclicPathIndex1</span><span class="cm">,</span> <span class="i">$FusedCyclicPathIndex2</span><span class="cm">,</span> <span class="i">$FusedCyclePairEdgeCount</span><span class="cm">,</span> <span class="i">@CyclicPathEdgeVertexIDs</span><span class="cm">,</span> <span class="i">%FusedCyclePairs</span><span class="cm">,</span> <span class="i">%CommonEdgeVisited</span><span class="cm">,</span> <span class="i">%CommonEdgesCount</span><span class="cm">,</span> <span class="i">%FusedCycles</span><span class="cm">,</span> <span class="i">%InValidFusedCycles</span><span class="s">)</span><span class="sc">;</span>
+2029 
+2030   <span class="i">%FusedCyclePairs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">%CommonEdgeVisited</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2031   <span class="i">%CommonEdgesCount</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2032   <span class="i">%InValidFusedCycles</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">%FusedCycles</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2033 
+2034   <span class="k">for</span> <span class="i">$ActiveCyclicPath</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2035     <span class="i">@CyclicPathEdgeVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2036     <span class="i">@CyclicPathEdgeVertexIDs</span> = <span class="i">$ActiveCyclicPath</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2037     <span class="j">EDGE:</span> <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#CyclicPathEdgeVertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+2038       <span class="i">$VertexID1</span> = <span class="i">$CyclicPathEdgeVertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$CyclicPathEdgeVertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+2039       <span class="i">$EdgeCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetEdgeProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2040       <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$EdgeCyclicPathsRef</span>} != <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+2041         <span class="c"># Not considered a fused edge...</span>
+2042         <span class="k">next</span> <span class="j">EDGE</span><span class="sc">;</span>
+2043       <span class="s">}</span>
+2044       <span class="c"># Set up a fused cycle pair...</span>
+2045       <span class="s">(</span><span class="i">$FusedCyclicPath1</span><span class="cm">,</span> <span class="i">$FusedCyclicPath2</span><span class="s">)</span> = <span class="i">@</span>{<span class="i">$EdgeCyclicPathsRef</span>}<span class="sc">;</span>
+2046       <span class="s">(</span><span class="i">$FusedCyclicPathID1</span><span class="cm">,</span> <span class="i">$FusedCyclicPathID2</span><span class="s">)</span> = <span class="s">(</span><span class="q">&quot;${FusedCyclicPath1}&quot;</span><span class="cm">,</span> <span class="q">&quot;${FusedCyclicPath2}&quot;</span><span class="s">)</span><span class="sc">;</span>
+2047       <span class="s">(</span><span class="i">$FusedCyclicPathIndex1</span><span class="cm">,</span> <span class="i">$FusedCyclicPathIndex2</span><span class="s">)</span> = <span class="s">(</span><span class="i">$CyclicPathIDToIndex</span>{<span class="i">$FusedCyclicPathID1</span>}<span class="cm">,</span> <span class="i">$CyclicPathIDToIndex</span>{<span class="i">$FusedCyclicPathID2</span>}<span class="s">)</span><span class="sc">;</span>
+2048       <span class="i">$FusedCyclePairID</span> = <span class="s">(</span><span class="i">$FusedCyclicPathIndex1</span> &lt; <span class="i">$FusedCyclicPathIndex2</span><span class="s">)</span> ? <span class="q">&quot;${FusedCyclicPathIndex1}-${FusedCyclicPathIndex2}&quot;</span> <span class="co">:</span> <span class="q">&quot;${FusedCyclicPathIndex2}-${FusedCyclicPathIndex1}&quot;</span><span class="sc">;</span>
+2049       <span class="i">$EdgeID</span> = <span class="s">(</span><span class="i">$VertexID1</span> &lt; <span class="i">$VertexID2</span><span class="s">)</span> ? <span class="q">&quot;${VertexID1}-${VertexID2}&quot;</span> <span class="co">:</span> <span class="q">&quot;${VertexID2}-${VertexID1}&quot;</span><span class="sc">;</span>
+2050 
+2051       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$FusedCyclePairs</span>{<span class="i">$FusedCyclePairID</span>}<span class="s">)</span> <span class="s">{</span>
+2052         <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$CommonEdgeVisited</span>{<span class="i">$FusedCyclePairID</span>}{<span class="i">$EdgeID</span>}<span class="s">)</span> <span class="s">{</span>
+2053           <span class="c"># Edge already processed...</span>
+2054           <span class="k">next</span> <span class="j">EDGE</span><span class="sc">;</span>
+2055         <span class="s">}</span>
+2056         <span class="i">$CommonEdgeVisited</span>{<span class="i">$FusedCyclePairID</span>}{<span class="i">$EdgeID</span>} = <span class="i">$EdgeID</span><span class="sc">;</span>
+2057 
+2058         <span class="i">$CommonEdgesCount</span>{<span class="i">$FusedCyclePairID</span>} += <span class="n">1</span><span class="sc">;</span>
+2059         <span class="k">push</span> <span class="i">@</span>{<span class="i">$FusedCyclePairs</span>{<span class="i">$FusedCyclePairID</span>}}<span class="cm">,</span> <span class="i">$EdgeID</span><span class="sc">;</span>
+2060       <span class="s">}</span>
+2061       <span class="k">else</span> <span class="s">{</span>
+2062         <span class="i">@</span>{<span class="i">$FusedCyclePairs</span>{<span class="i">$FusedCyclePairID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2063         <span class="k">push</span> <span class="i">@</span>{<span class="i">$FusedCyclePairs</span>{<span class="i">$FusedCyclePairID</span>}}<span class="cm">,</span> <span class="i">$EdgeID</span><span class="sc">;</span>
+2064 
+2065         <span class="i">%</span>{<span class="i">$CommonEdgeVisited</span>{<span class="i">$FusedCyclePairID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2066         <span class="i">$CommonEdgeVisited</span>{<span class="i">$FusedCyclePairID</span>}{<span class="i">$EdgeID</span>} = <span class="i">$EdgeID</span><span class="sc">;</span>
+2067 
+2068         <span class="i">$CommonEdgesCount</span>{<span class="i">$FusedCyclePairID</span>} = <span class="n">1</span><span class="sc">;</span>
+2069       <span class="s">}</span>
+2070     <span class="s">}</span>
+2071   <span class="s">}</span>
+2072   <span class="c"># Valid fused cyle in fused cycle pairs must have only one common egde...</span>
+2073   <span class="k">for</span> <span class="i">$FusedCyclePairID</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%FusedCyclePairs</span><span class="s">)</span> <span class="s">{</span>
+2074     <span class="s">(</span><span class="i">$FusedCyclicPathIndex1</span><span class="cm">,</span> <span class="i">$FusedCyclicPathIndex2</span><span class="s">)</span> = <span class="k">split</span> <span class="q">/-/</span><span class="cm">,</span> <span class="i">$FusedCyclePairID</span><span class="sc">;</span>
+2075     <span class="i">$FusedCycles</span>{<span class="i">$FusedCyclicPathIndex1</span>} = <span class="i">$FusedCyclicPathIndex1</span><span class="sc">;</span>
+2076     <span class="i">$FusedCycles</span>{<span class="i">$FusedCyclicPathIndex2</span>} = <span class="i">$FusedCyclicPathIndex2</span><span class="sc">;</span>
+2077     <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FusedCyclePairs</span>{<span class="i">$FusedCyclePairID</span>}} != <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
+2078       <span class="c"># Mark the cycles involved as invalid fused cycles...</span>
+2079       <span class="i">$InValidFusedCycles</span>{<span class="i">$FusedCyclicPathIndex1</span>} = <span class="i">$FusedCyclicPathIndex1</span><span class="sc">;</span>
+2080       <span class="i">$InValidFusedCycles</span>{<span class="i">$FusedCyclicPathIndex2</span>} = <span class="i">$FusedCyclicPathIndex2</span><span class="sc">;</span>
+2081     <span class="s">}</span>
+2082   <span class="s">}</span>
+2083   <span class="k">return</span> <span class="s">(</span>\<span class="i">%FusedCyclePairs</span><span class="cm">,</span> \<span class="i">%FusedCycles</span><span class="cm">,</span> \<span class="i">%InValidFusedCycles</span><span class="s">)</span><span class="sc">;</span>
+2084 <span class="s">}</span>
+2085 
+2086 <span class="c"># Go over fused cycles and set up a graph to collect fused cycle sets. Graph vertices</span>
+2087 <span class="c"># correspond to cylce indices; edges correspond to pair of fused cylcles; fused cycle</span>
+2088 <span class="c"># sets correspond to connected components. Addionally set up common edges for</span>
+2089 <span class="c"># fused cycle sets.</span>
+2090 <span class="c">#</span>
+<a name="_GetFusedCycleSetsIndices-"></a>2091 <span class="k">sub </span><span class="m">_GetFusedCycleSetsIndices</span> <span class="s">{</span>
+2092   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$FusedCyclePairsRef</span><span class="cm">,</span> <span class="i">$FusedCyclesRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2093   <span class="k">my</span><span class="s">(</span><span class="i">$FusedCyclesGraph</span><span class="cm">,</span> <span class="i">@FusedCycleIndices</span><span class="cm">,</span> <span class="i">@FusedCyclePairIndices</span><span class="cm">,</span> <span class="i">@FusedCycleSetsIndices</span><span class="s">)</span><span class="sc">;</span>
+2094 
+2095   <span class="i">@FusedCycleIndices</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@FusedCyclePairIndices</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2096   <span class="i">@FusedCycleSetsIndices</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2097 
+2098   <span class="i">@FusedCycleIndices</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> &lt;=&gt; <span class="i">$b</span> <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$FusedCyclesRef</span>}<span class="sc">;</span>
+2099   <span class="i">@FusedCyclePairIndices</span> = <span class="k">map</span> <span class="s">{</span> <span class="k">split</span> <span class="q">/-/</span><span class="cm">,</span> <span class="i">$_</span><span class="sc">;</span> <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$FusedCyclePairsRef</span>}<span class="sc">;</span>
+2100   <span class="k">if</span> <span class="s">(</span>!<span class="i">@FusedCycleIndices</span><span class="s">)</span> <span class="s">{</span>
+2101     <span class="c"># No fused cycles out there...</span>
+2102     <span class="k">return</span> \<span class="i">@FusedCycleSetsIndices</span><span class="sc">;</span>
+2103   <span class="s">}</span>
+2104   <span class="i">$FusedCyclesGraph</span> = <span class="i">new</span> <span class="i">Graph</span><span class="s">(</span><span class="i">@FusedCycleIndices</span><span class="s">)</span><span class="sc">;</span>
+2105   <span class="i">$FusedCyclesGraph</span><span class="i">-&gt;AddEdges</span><span class="s">(</span><span class="i">@FusedCyclePairIndices</span><span class="s">)</span><span class="sc">;</span>
+2106 
+2107   <span class="i">@FusedCycleSetsIndices</span> = <span class="i">$FusedCyclesGraph</span><span class="i">-&gt;GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2108 
+2109   <span class="k">return</span> \<span class="i">@FusedCycleSetsIndices</span><span class="sc">;</span>
+2110 <span class="s">}</span>
+2111 
+2112 <span class="c"># Go over indices of fused cycle sets and map cyclic path indices to cyclic path objects.</span>
+2113 <span class="c"># For fused sets containing a cycle with more than one common edge, the whole set is treated</span>
+2114 <span class="c"># as non-fused set...</span>
+2115 <span class="c">#</span>
+<a name="_GetFusedAndNonFusedCycles-"></a>2116 <span class="k">sub </span><span class="m">_GetFusedAndNonFusedCycles</span> <span class="s">{</span>
+2117   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ActiveCyclicPathsRef</span><span class="cm">,</span> <span class="i">$FusedCycleSetsIndicesRef</span><span class="cm">,</span> <span class="i">$InValidFusedCycleRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2118   <span class="k">my</span><span class="s">(</span><span class="i">$CycleSetIndicesRef</span><span class="cm">,</span> <span class="i">$CyclicPathIndex</span><span class="cm">,</span> <span class="i">$ValidFusedCycleSet</span><span class="cm">,</span> <span class="i">@FusedCycleSets</span><span class="cm">,</span> <span class="i">@UnsortedNonFusedCycles</span><span class="cm">,</span> <span class="i">@NonFusedCycles</span><span class="cm">,</span> <span class="i">%CycleIndexVisited</span><span class="s">)</span><span class="sc">;</span>
+2119 
+2120   <span class="i">@FusedCycleSets</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@NonFusedCycles</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@UnsortedNonFusedCycles</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2121   <span class="i">%CycleIndexVisited</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2122   <span class="k">for</span> <span class="i">$CycleSetIndicesRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FusedCycleSetsIndicesRef</span>}<span class="s">)</span> <span class="s">{</span>
+2123     <span class="c"># Is it a valid fused cycle set? Fused cycle set containing any cycle with more than one common</span>
+2124     <span class="c"># edge is considered invalid and all its cycles are treated as non-fused cycles.</span>
+2125     <span class="i">$ValidFusedCycleSet</span> = <span class="n">1</span><span class="sc">;</span>
+2126     <span class="k">for</span> <span class="i">$CyclicPathIndex</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$CycleSetIndicesRef</span>}<span class="s">)</span> <span class="s">{</span>
+2127       <span class="i">$CycleIndexVisited</span>{<span class="i">$CyclicPathIndex</span>} = <span class="i">$CyclicPathIndex</span><span class="sc">;</span>
+2128       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$InValidFusedCycleRef</span>-&gt;{<span class="i">$CyclicPathIndex</span>}<span class="s">)</span> <span class="s">{</span>
+2129         <span class="i">$ValidFusedCycleSet</span> = <span class="n">0</span><span class="sc">;</span>
+2130       <span class="s">}</span>
+2131     <span class="s">}</span>
+2132     <span class="k">if</span> <span class="s">(</span><span class="i">$ValidFusedCycleSet</span><span class="s">)</span> <span class="s">{</span>
+2133       <span class="k">my</span><span class="s">(</span><span class="i">@FusedCycleSet</span><span class="s">)</span><span class="sc">;</span>
+2134       <span class="i">@FusedCycleSet</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2135       <span class="k">push</span> <span class="i">@FusedCycleSet</span><span class="cm">,</span> <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span> &lt;=&gt; <span class="i">$b</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span> <span class="s">}</span> <span class="k">map</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span>-&gt;[<span class="i">$_</span>] <span class="s">}</span> <span class="i">@</span>{<span class="i">$CycleSetIndicesRef</span>}<span class="sc">;</span>
+2136       <span class="k">push</span> <span class="i">@FusedCycleSets</span><span class="cm">,</span> \<span class="i">@FusedCycleSet</span><span class="sc">;</span>
+2137     <span class="s">}</span>
+2138     <span class="k">else</span> <span class="s">{</span>
+2139       <span class="k">push</span> <span class="i">@UnsortedNonFusedCycles</span><span class="cm">,</span> <span class="k">map</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span>-&gt;[<span class="i">$_</span>] <span class="s">}</span> <span class="i">@</span>{<span class="i">$CycleSetIndicesRef</span>}<span class="sc">;</span>
+2140     <span class="s">}</span>
+2141   <span class="s">}</span>
+2142 
+2143   <span class="c"># Add any leftover cycles to non-fused cycles list...</span>
+2144   <span class="j">CYCLICPATH:</span> <span class="k">for</span> <span class="i">$CyclicPathIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2145     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$CycleIndexVisited</span>{<span class="i">$CyclicPathIndex</span>}<span class="s">)</span> <span class="s">{</span>
+2146       <span class="k">next</span> <span class="j">CYCLICPATH</span><span class="sc">;</span>
+2147     <span class="s">}</span>
+2148     <span class="k">push</span> <span class="i">@UnsortedNonFusedCycles</span><span class="cm">,</span> <span class="i">$ActiveCyclicPathsRef</span>-&gt;[<span class="i">$CyclicPathIndex</span>]<span class="sc">;</span>
+2149   <span class="s">}</span>
+2150   <span class="i">@NonFusedCycles</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span> &lt;=&gt; <span class="i">$b</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span> <span class="s">}</span> <span class="i">@UnsortedNonFusedCycles</span><span class="sc">;</span>
+2151 
+2152   <span class="k">return</span> <span class="s">(</span>\<span class="i">@FusedCycleSets</span><span class="cm">,</span> \<span class="i">@NonFusedCycles</span><span class="s">)</span><span class="sc">;</span>
+2153 <span class="s">}</span>
+2154 
+2155 <span class="c"># Delete cycles associated with graph...</span>
+2156 <span class="c">#</span>
+<a name="_DeleteCyclesAssociatedWithGraph-"></a>2157 <span class="k">sub </span><span class="m">_DeleteCyclesAssociatedWithGraph</span> <span class="s">{</span>
+2158   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2159 
+2160   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2161     <span class="i">$This</span><span class="i">-&gt;DeleteGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span>
+2162     <span class="i">$This</span><span class="i">-&gt;DeleteGraphProperty</span><span class="s">(</span><span class="q">&#39;AllCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span>
+2163     <span class="i">$This</span><span class="i">-&gt;DeleteGraphProperty</span><span class="s">(</span><span class="q">&#39;IndependentCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span>
+2164   <span class="s">}</span>
+2165   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+2166 <span class="s">}</span>
+2167 
+2168 <span class="c"># Delete cycles associated with vertices...</span>
+2169 <span class="c">#</span>
+<a name="_DeleteCyclesAssociatedWithVertices-"></a>2170 <span class="k">sub </span><span class="m">_DeleteCyclesAssociatedWithVertices</span> <span class="s">{</span>
+2171   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2172   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
+2173 
+2174   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2175   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2176   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
+2177     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasVertexProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2178       <span class="i">$This</span><span class="i">-&gt;DeleteVertexProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2179     <span class="s">}</span>
+2180   <span class="s">}</span>
+2181   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+2182 <span class="s">}</span>
+2183 
+2184 <span class="c"># Delete cycles associated with edges...</span>
+2185 <span class="c">#</span>
+<a name="_DeleteCyclesAssociatedWithEdges-"></a>2186 <span class="k">sub </span><span class="m">_DeleteCyclesAssociatedWithEdges</span> <span class="s">{</span>
+2187   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2188   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">@EdgeVertexIDs</span><span class="s">)</span><span class="sc">;</span>
+2189 
+2190   <span class="i">@EdgeVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2191   <span class="i">@EdgeVertexIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2192   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#EdgeVertexIDs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
+2193     <span class="i">$VertexID1</span> = <span class="i">$EdgeVertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$VertexID2</span> = <span class="i">$EdgeVertexIDs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
+2194     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasEdgeProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2195       <span class="i">$This</span><span class="i">-&gt;DeleteEdgeProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2196     <span class="s">}</span>
+2197   <span class="s">}</span>
+2198   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+2199 <span class="s">}</span>
+2200 
+2201 <span class="c"># Delete fused cycles associated with edges...</span>
+2202 <span class="c">#</span>
+<a name="_DeleteFusedCyclesAssociatedWithGraph-"></a>2203 <span class="k">sub </span><span class="m">_DeleteFusedCyclesAssociatedWithGraph</span> <span class="s">{</span>
+2204   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2205 
+2206   <span class="c"># Delete exisiting cycles...</span>
+2207   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasGraphProperty</span><span class="s">(</span><span class="q">&#39;FusedActiveCyclicPaths&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2208     <span class="i">$This</span><span class="i">-&gt;DeleteGraphProperty</span><span class="s">(</span><span class="q">&#39;FusedActiveCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span>
+2209     <span class="i">$This</span><span class="i">-&gt;DeleteGraphProperty</span><span class="s">(</span><span class="q">&#39;NonFusedActiveCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span>
+2210   <span class="s">}</span>
+2211   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+2212 <span class="s">}</span>
+2213 
+2214 <span class="c"># Does graph contains any cycles?</span>
+2215 <span class="c">#</span>
+<a name="IsAcyclic-"></a>2216 <span class="k">sub </span><span class="m">IsAcyclic</span> <span class="s">{</span>
+2217   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2218 
+2219   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfCycles</span><span class="s">(</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+2220 <span class="s">}</span>
+2221 
+2222 <span class="c"># Does graph contains cycles?</span>
+2223 <span class="c">#</span>
+<a name="IsCyclic-"></a>2224 <span class="k">sub </span><span class="m">IsCyclic</span> <span class="s">{</span>
+2225   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2226 
+2227   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfCycles</span><span class="s">(</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+2228 <span class="s">}</span>
+2229 
+2230 <span class="c"># Does graph contains only any cycle?</span>
+2231 <span class="c">#</span>
+<a name="IsUnicyclic-"></a>2232 <span class="k">sub </span><span class="m">IsUnicyclic</span> <span class="s">{</span>
+2233   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2234 
+2235   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetNumOfCycles</span><span class="s">(</span><span class="s">)</span> == <span class="n">1</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+2236 <span class="s">}</span>
+2237 
+2238 <span class="c"># Get size of smallest cycle in graph...</span>
+2239 <span class="c">#</span>
+<a name="GetGirth-"></a>2240 <span class="k">sub </span><span class="m">GetGirth</span> <span class="s">{</span>
+2241   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2242 
+2243   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetSizeOfSmallestCycle</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2244 <span class="s">}</span>
+2245 
+2246 <span class="c"># Get size of smallest cycle in graph...</span>
+2247 <span class="c">#</span>
+<a name="GetSizeOfSmallestCycle-"></a>2248 <span class="k">sub </span><span class="m">GetSizeOfSmallestCycle</span> <span class="s">{</span>
+2249   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2250 
+2251   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycleSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SmallestCycle&#39;</span><span class="s">)</span><span class="sc">;</span>
+2252 <span class="s">}</span>
+2253 
+2254 <span class="c"># Get size of largest cycle in graph...</span>
+2255 <span class="c">#</span>
+<a name="GetCircumference-"></a>2256 <span class="k">sub </span><span class="m">GetCircumference</span> <span class="s">{</span>
+2257   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2258 
+2259   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetSizeOfLargestCycle</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2260 <span class="s">}</span>
+2261 
+2262 <span class="c"># Get size of largest cycle in graph...</span>
+2263 <span class="c">#</span>
+<a name="GetSizeOfLargestCycle-"></a>2264 <span class="k">sub </span><span class="m">GetSizeOfLargestCycle</span> <span class="s">{</span>
+2265   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2266 
+2267   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycleSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;LargestCycle&#39;</span><span class="s">)</span><span class="sc">;</span>
+2268 <span class="s">}</span>
+2269 
+2270 <span class="c"># Get number of cycles in graph...</span>
+2271 <span class="c">#</span>
+<a name="GetNumOfCycles-"></a>2272 <span class="k">sub </span><span class="m">GetNumOfCycles</span> <span class="s">{</span>
+2273   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2274 
+2275   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;AllSizes&#39;</span><span class="s">)</span><span class="sc">;</span>
+2276 <span class="s">}</span>
+2277 
+2278 <span class="c"># Get number of cycles with odd size in graph...</span>
+2279 <span class="c">#</span>
+<a name="GetNumOfCyclesWithOddSize-"></a>2280 <span class="k">sub </span><span class="m">GetNumOfCyclesWithOddSize</span> <span class="s">{</span>
+2281   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2282 
+2283   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;OddSize&#39;</span><span class="s">)</span><span class="sc">;</span>
+2284 <span class="s">}</span>
+2285 
+2286 <span class="c"># Get number of cycles with even size in graph...</span>
+2287 <span class="c">#</span>
+<a name="GetNumOfCyclesWithEvenSize-"></a>2288 <span class="k">sub </span><span class="m">GetNumOfCyclesWithEvenSize</span> <span class="s">{</span>
+2289   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2290 
+2291   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;EvenSize&#39;</span><span class="s">)</span><span class="sc">;</span>
+2292 <span class="s">}</span>
+2293 
+2294 <span class="c"># Get number of cycles with specific size in graph...</span>
+2295 <span class="c">#</span>
+<a name="GetNumOfCyclesWithSize-"></a>2296 <span class="k">sub </span><span class="m">GetNumOfCyclesWithSize</span> <span class="s">{</span>
+2297   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2298 
+2299   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SpecifiedSize&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span><span class="sc">;</span>
+2300 <span class="s">}</span>
+2301 
+2302 <span class="c"># Get number of cycles with size less than a specific size in graph...</span>
+2303 <span class="c">#</span>
+<a name="GetNumOfCyclesWithSizeLessThan-"></a>2304 <span class="k">sub </span><span class="m">GetNumOfCyclesWithSizeLessThan</span> <span class="s">{</span>
+2305   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2306 
+2307   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SizeLessThan&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span><span class="sc">;</span>
+2308 <span class="s">}</span>
+2309 
+2310 <span class="c"># Get number of cycles with size greater than a specific size in graph...</span>
+2311 <span class="c">#</span>
+<a name="GetNumOfCyclesWithSizeGreaterThan-"></a>2312 <span class="k">sub </span><span class="m">GetNumOfCyclesWithSizeGreaterThan</span> <span class="s">{</span>
+2313   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2314 
+2315   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SizeGreaterThan&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span><span class="sc">;</span>
+2316 <span class="s">}</span>
+2317 
+2318 <span class="c"># Get largest cyclic path in graph...</span>
+2319 <span class="c">#</span>
+<a name="GetLargestCycle-"></a>2320 <span class="k">sub </span><span class="m">GetLargestCycle</span> <span class="s">{</span>
+2321   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2322 
+2323   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycle</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;LargestCycle&#39;</span><span class="s">)</span><span class="sc">;</span>
+2324 <span class="s">}</span>
+2325 
+2326 <span class="c"># Get smallest cyclic path in graph...</span>
+2327 <span class="c">#</span>
+<a name="GetSmallestCycle-"></a>2328 <span class="k">sub </span><span class="m">GetSmallestCycle</span> <span class="s">{</span>
+2329   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2330 
+2331   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycle</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SmallestCycle&#39;</span><span class="s">)</span><span class="sc">;</span>
+2332 <span class="s">}</span>
+2333 
+2334 <span class="c"># Get all cycles in graph...</span>
+2335 <span class="c">#</span>
+<a name="GetCycles-"></a>2336 <span class="k">sub </span><span class="m">GetCycles</span> <span class="s">{</span>
+2337   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2338 
+2339   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;AllSizes&#39;</span><span class="s">)</span><span class="sc">;</span>
+2340 <span class="s">}</span>
+2341 
+2342 <span class="c"># Get cycles with odd size in graph...</span>
+2343 <span class="c">#</span>
+<a name="GetCyclesWithOddSize-"></a>2344 <span class="k">sub </span><span class="m">GetCyclesWithOddSize</span> <span class="s">{</span>
+2345   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2346 
+2347   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;OddSize&#39;</span><span class="s">)</span><span class="sc">;</span>
+2348 <span class="s">}</span>
+2349 
+2350 <span class="c"># Get cycles with even size in graph...</span>
+2351 <span class="c">#</span>
+<a name="GetCyclesWithEvenSize-"></a>2352 <span class="k">sub </span><span class="m">GetCyclesWithEvenSize</span> <span class="s">{</span>
+2353   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2354 
+2355   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;EvenSize&#39;</span><span class="s">)</span><span class="sc">;</span>
+2356 <span class="s">}</span>
+2357 
+2358 <span class="c"># Get cycles with specific size in graph...</span>
+2359 <span class="c">#</span>
+<a name="GetCyclesWithSize-"></a>2360 <span class="k">sub </span><span class="m">GetCyclesWithSize</span> <span class="s">{</span>
+2361   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2362 
+2363   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SpecifiedSize&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span><span class="sc">;</span>
+2364 <span class="s">}</span>
+2365 
+2366 <span class="c"># Get cycles with size less than a specific size in graph...</span>
+2367 <span class="c">#</span>
+<a name="GetCyclesWithSizeLessThan-"></a>2368 <span class="k">sub </span><span class="m">GetCyclesWithSizeLessThan</span> <span class="s">{</span>
+2369   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2370 
+2371   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SizeLessThan&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span><span class="sc">;</span>
+2372 <span class="s">}</span>
+2373 
+2374 <span class="c"># Get cycles with size greater than a specific size in graph...</span>
+2375 <span class="c">#</span>
+<a name="GetCyclesWithSizeGreaterThan-"></a>2376 <span class="k">sub </span><span class="m">GetCyclesWithSizeGreaterThan</span> <span class="s">{</span>
+2377   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2378 
+2379   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;GraphCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SizeGreaterThan&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span><span class="sc">;</span>
+2380 <span class="s">}</span>
+2381 
+2382 <span class="c"># Is vertex in a cycle?</span>
+2383 <span class="c">#</span>
+<a name="IsCyclicVertex-"></a>2384 <span class="k">sub </span><span class="m">IsCyclicVertex</span> <span class="s">{</span>
+2385   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2386 
+2387   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfVertexCycles</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+2388 <span class="s">}</span>
+2389 
+2390 <span class="c"># Is vertex in a only one cycle?</span>
+2391 <span class="c">#</span>
+<a name="IsUnicyclicVertex-"></a>2392 <span class="k">sub </span><span class="m">IsUnicyclicVertex</span> <span class="s">{</span>
+2393   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2394 
+2395   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetNumOfVertexCycles</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span>  == <span class="n">1</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+2396 <span class="s">}</span>
+2397 
+2398 <span class="c"># Is vertex not in a cycle?</span>
+2399 <span class="c">#</span>
+<a name="IsAcyclicVertex-"></a>2400 <span class="k">sub </span><span class="m">IsAcyclicVertex</span> <span class="s">{</span>
+2401   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2402 
+2403   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfVertexCycles</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+2404 <span class="s">}</span>
+2405 
+2406 <span class="c"># Get size of smallest cycle containing specified vertex...</span>
+2407 <span class="c">#</span>
+<a name="GetSizeOfSmallestVertexCycle-"></a>2408 <span class="k">sub </span><span class="m">GetSizeOfSmallestVertexCycle</span> <span class="s">{</span>
+2409   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2410 
+2411   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycleSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SmallestCycle&#39;</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2412 <span class="s">}</span>
+2413 
+2414 <span class="c"># Get size of largest cycle containing specified vertex...</span>
+2415 <span class="c">#</span>
+<a name="GetSizeOfLargestVertexCycle-"></a>2416 <span class="k">sub </span><span class="m">GetSizeOfLargestVertexCycle</span> <span class="s">{</span>
+2417   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2418 
+2419   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycleSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;LargestCycle&#39;</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2420 <span class="s">}</span>
+2421 
+2422 <span class="c"># Get number of cycles containing specified vertex...</span>
+2423 <span class="c">#</span>
+<a name="GetNumOfVertexCycles-"></a>2424 <span class="k">sub </span><span class="m">GetNumOfVertexCycles</span> <span class="s">{</span>
+2425   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2426 
+2427   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;AllSizes&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2428 <span class="s">}</span>
+2429 
+2430 <span class="c"># Get number of cycles with odd size containing specified vertex...</span>
+2431 <span class="c">#</span>
+<a name="GetNumOfVertexCyclesWithOddSize-"></a>2432 <span class="k">sub </span><span class="m">GetNumOfVertexCyclesWithOddSize</span> <span class="s">{</span>
+2433   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2434 
+2435   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;OddSize&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2436 <span class="s">}</span>
+2437 
+2438 <span class="c"># Get number of cycles with even size containing specified vertex...</span>
+2439 <span class="c">#</span>
+<a name="GetNumOfVertexCyclesWithEvenSize-"></a>2440 <span class="k">sub </span><span class="m">GetNumOfVertexCyclesWithEvenSize</span> <span class="s">{</span>
+2441   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2442 
+2443   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;EvenSize&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2444 <span class="s">}</span>
+2445 
+2446 <span class="c"># Get number of cycles with specified size containing specified vertex...</span>
+2447 <span class="c">#</span>
+<a name="GetNumOfVertexCyclesWithSize-"></a>2448 <span class="k">sub </span><span class="m">GetNumOfVertexCyclesWithSize</span> <span class="s">{</span>
+2449   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2450 
+2451   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SpecifiedSize&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2452 <span class="s">}</span>
+2453 
+2454 <span class="c"># Get number of cycles with size less than specified size containing specified vertex...</span>
+2455 <span class="c">#</span>
+<a name="GetNumOfVertexCyclesWithSizeLessThan-"></a>2456 <span class="k">sub </span><span class="m">GetNumOfVertexCyclesWithSizeLessThan</span> <span class="s">{</span>
+2457   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2458 
+2459   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SizeLessThan&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2460 <span class="s">}</span>
+2461 
+2462 <span class="c"># Get number of cycles with size greater than specified size containing specified vertex...</span>
+2463 <span class="c">#</span>
+<a name="GetNumOfVertexCyclesWithSizeGreaterThan-"></a>2464 <span class="k">sub </span><span class="m">GetNumOfVertexCyclesWithSizeGreaterThan</span> <span class="s">{</span>
+2465   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2466 
+2467   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SizeGreaterThan&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2468 <span class="s">}</span>
+2469 
+2470 <span class="c"># Get smallest cycle containing specified vertex...</span>
+2471 <span class="c">#</span>
+<a name="GetSmallestVertexCycle-"></a>2472 <span class="k">sub </span><span class="m">GetSmallestVertexCycle</span> <span class="s">{</span>
+2473   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2474 
+2475   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycle</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SmallestCycle&#39;</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2476 <span class="s">}</span>
+2477 
+2478 <span class="c"># Get largest cycle containing specified vertex...</span>
+2479 <span class="c">#</span>
+<a name="GetLargestVertexCycle-"></a>2480 <span class="k">sub </span><span class="m">GetLargestVertexCycle</span> <span class="s">{</span>
+2481   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2482 
+2483   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycle</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;LargestCycle&#39;</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2484 <span class="s">}</span>
+2485 
+2486 <span class="c"># Get cycles containing specified vertex...</span>
+2487 <span class="c">#</span>
+<a name="GetVertexCycles-"></a>2488 <span class="k">sub </span><span class="m">GetVertexCycles</span> <span class="s">{</span>
+2489   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2490 
+2491   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;AllSizes&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2492 <span class="s">}</span>
+2493 
+2494 <span class="c"># Get cycles with odd size containing specified vertex...</span>
+2495 <span class="c">#</span>
+<a name="GetVertexCyclesWithOddSize-"></a>2496 <span class="k">sub </span><span class="m">GetVertexCyclesWithOddSize</span> <span class="s">{</span>
+2497   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2498 
+2499   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;OddSize&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2500 <span class="s">}</span>
+2501 
+2502 <span class="c"># Get cycles with even size containing specified vertex...</span>
+2503 <span class="c">#</span>
+<a name="GetVertexCyclesWithEvenSize-"></a>2504 <span class="k">sub </span><span class="m">GetVertexCyclesWithEvenSize</span> <span class="s">{</span>
+2505   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2506 
+2507   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;EvenSize&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2508 <span class="s">}</span>
+2509 
+2510 <span class="c"># Get cycles with specified size containing specified vertex...</span>
+2511 <span class="c">#</span>
+<a name="GetVertexCyclesWithSize-"></a>2512 <span class="k">sub </span><span class="m">GetVertexCyclesWithSize</span> <span class="s">{</span>
+2513   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2514 
+2515   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SpecifiedSize&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2516 <span class="s">}</span>
+2517 
+2518 <span class="c"># Get cycles with size less than specified size containing specified vertex...</span>
+2519 <span class="c">#</span>
+<a name="GetVertexCyclesWithSizeLessThan-"></a>2520 <span class="k">sub </span><span class="m">GetVertexCyclesWithSizeLessThan</span> <span class="s">{</span>
+2521   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2522 
+2523   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SizeLessThan&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2524 <span class="s">}</span>
+2525 
+2526 <span class="c"># Get cycles with size greater than specified size containing specified vertex...</span>
+2527 <span class="c">#</span>
+<a name="GetVertexCyclesWithSizeGreaterThan-"></a>2528 <span class="k">sub </span><span class="m">GetVertexCyclesWithSizeGreaterThan</span> <span class="s">{</span>
+2529   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2530 
+2531   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;VertexCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SizeGreaterThan&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
+2532 <span class="s">}</span>
+2533 
+2534 <span class="c"># Is edge in a cycle?</span>
+2535 <span class="c">#</span>
+<a name="IsCyclicEdge-"></a>2536 <span class="k">sub </span><span class="m">IsCyclicEdge</span> <span class="s">{</span>
+2537   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2538 
+2539   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfEdgeCycles</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+2540 <span class="s">}</span>
+2541 
+2542 <span class="c"># Is edge in a only one cycle?</span>
+2543 <span class="c">#</span>
+<a name="IsUnicyclicEdge-"></a>2544 <span class="k">sub </span><span class="m">IsUnicyclicEdge</span> <span class="s">{</span>
+2545   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2546 
+2547   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetNumOfEdgeCycles</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span>  == <span class="n">1</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+2548 <span class="s">}</span>
+2549 
+2550 <span class="c"># Is Edge not in a cycle?</span>
+2551 <span class="c">#</span>
+<a name="IsAcyclicEdge-"></a>2552 <span class="k">sub </span><span class="m">IsAcyclicEdge</span> <span class="s">{</span>
+2553   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2554 
+2555   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfEdgeCycles</span><span class="s">(</span><span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+2556 <span class="s">}</span>
+2557 
+2558 <span class="c"># Get size of smallest cycle containing specified edge...</span>
+2559 <span class="c">#</span>
+<a name="GetSizeOfSmallestEdgeCycle-"></a>2560 <span class="k">sub </span><span class="m">GetSizeOfSmallestEdgeCycle</span> <span class="s">{</span>
+2561   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2562 
+2563   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycleSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SmallestCycle&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2564 <span class="s">}</span>
+2565 
+2566 <span class="c"># Get size of largest cycle containing specified edge...</span>
+2567 <span class="c">#</span>
+<a name="GetSizeOfLargestEdgeCycle-"></a>2568 <span class="k">sub </span><span class="m">GetSizeOfLargestEdgeCycle</span> <span class="s">{</span>
+2569   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2570 
+2571   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycleSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;LargestCycle&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2572 <span class="s">}</span>
+2573 
+2574 <span class="c"># Get number of cycles containing specified edge...</span>
+2575 <span class="c">#</span>
+<a name="GetNumOfEdgeCycles-"></a>2576 <span class="k">sub </span><span class="m">GetNumOfEdgeCycles</span> <span class="s">{</span>
+2577   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2578 
+2579   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;AllSizes&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2580 <span class="s">}</span>
+2581 
+2582 <span class="c"># Get number of cycles with odd size containing specified edge...</span>
+2583 <span class="c">#</span>
+<a name="GetNumOfEdgeCyclesWithOddSize-"></a>2584 <span class="k">sub </span><span class="m">GetNumOfEdgeCyclesWithOddSize</span> <span class="s">{</span>
+2585   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2586 
+2587   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;OddSize&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2588 <span class="s">}</span>
+2589 
+2590 <span class="c"># Get number of cycles with even size containing specified edge...</span>
+2591 <span class="c">#</span>
+<a name="GetNumOfEdgeCyclesWithEvenSize-"></a>2592 <span class="k">sub </span><span class="m">GetNumOfEdgeCyclesWithEvenSize</span> <span class="s">{</span>
+2593   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2594 
+2595   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;EvenSize&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2596 <span class="s">}</span>
+2597 
+2598 <span class="c"># Get number of cycles with specified size containing specified edge...</span>
+2599 <span class="c">#</span>
+<a name="GetNumOfEdgeCyclesWithSize-"></a>2600 <span class="k">sub </span><span class="m">GetNumOfEdgeCyclesWithSize</span> <span class="s">{</span>
+2601   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2602 
+2603   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SpecifiedSize&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2604 <span class="s">}</span>
+2605 
+2606 <span class="c"># Get number of cycles with size less than specified size containing specified edge...</span>
+2607 <span class="c">#</span>
+<a name="GetNumOfEdgeCyclesWithSizeLessThan-"></a>2608 <span class="k">sub </span><span class="m">GetNumOfEdgeCyclesWithSizeLessThan</span> <span class="s">{</span>
+2609   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2610 
+2611   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SizeLessThan&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2612 <span class="s">}</span>
+2613 
+2614 <span class="c"># Get number of cycles with size greater than specified size containing specified edge...</span>
+2615 <span class="c">#</span>
+<a name="GetNumOfEdgeCyclesWithSizeGreaterThan-"></a>2616 <span class="k">sub </span><span class="m">GetNumOfEdgeCyclesWithSizeGreaterThan</span> <span class="s">{</span>
+2617   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2618 
+2619   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SizeGreaterThan&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2620 <span class="s">}</span>
+2621 
+2622 <span class="c"># Get smallest cycle containing specified edge...</span>
+2623 <span class="c">#</span>
+<a name="GetSmallestEdgeCycle-"></a>2624 <span class="k">sub </span><span class="m">GetSmallestEdgeCycle</span> <span class="s">{</span>
+2625   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2626 
+2627   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycle</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SmallestCycle&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2628 <span class="s">}</span>
+2629 
+2630 <span class="c"># Get largest cycle containing specified edge...</span>
+2631 <span class="c">#</span>
+<a name="GetLargestEdgeCycle-"></a>2632 <span class="k">sub </span><span class="m">GetLargestEdgeCycle</span> <span class="s">{</span>
+2633   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2634 
+2635   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycle</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;LargestCycle&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2636 <span class="s">}</span>
+2637 
+2638 <span class="c"># Get cycles containing specified edge...</span>
+2639 <span class="c">#</span>
+<a name="GetEdgeCycles-"></a>2640 <span class="k">sub </span><span class="m">GetEdgeCycles</span> <span class="s">{</span>
+2641   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2642 
+2643   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;AllSizes&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2644 <span class="s">}</span>
+2645 
+2646 <span class="c"># Get cycles with odd size containing specified edge...</span>
+2647 <span class="c">#</span>
+<a name="GetEdgeCyclesWithOddSize-"></a>2648 <span class="k">sub </span><span class="m">GetEdgeCyclesWithOddSize</span> <span class="s">{</span>
+2649   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2650 
+2651   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;OddSize&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2652 <span class="s">}</span>
+2653 
+2654 <span class="c"># Get cycles with even size containing specified edge...</span>
+2655 <span class="c">#</span>
+<a name="GetEdgeCyclesWithEvenSize-"></a>2656 <span class="k">sub </span><span class="m">GetEdgeCyclesWithEvenSize</span> <span class="s">{</span>
+2657   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2658 
+2659   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;EvenSize&#39;</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2660 <span class="s">}</span>
+2661 
+2662 <span class="c"># Get cycles with specified size containing specified edge...</span>
+2663 <span class="c">#</span>
+<a name="GetEdgeCyclesWithSize-"></a>2664 <span class="k">sub </span><span class="m">GetEdgeCyclesWithSize</span> <span class="s">{</span>
+2665   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2666 
+2667   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SpecifiedSize&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2668 <span class="s">}</span>
+2669 
+2670 <span class="c"># Get cycles with size less than specified size containing specified edge...</span>
+2671 <span class="c">#</span>
+<a name="GetEdgeCyclesWithSizeLessThan-"></a>2672 <span class="k">sub </span><span class="m">GetEdgeCyclesWithSizeLessThan</span> <span class="s">{</span>
+2673   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2674 
+2675   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SizeLessThan&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2676 <span class="s">}</span>
+2677 
+2678 <span class="c"># Get cycles with size greater than specified size containing specified edge...</span>
+2679 <span class="c">#</span>
+<a name="GetEdgeCyclesWithSizeGreaterThan-"></a>2680 <span class="k">sub </span><span class="m">GetEdgeCyclesWithSizeGreaterThan</span> <span class="s">{</span>
+2681   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2682 
+2683   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCyclesWithSize</span><span class="s">(</span><span class="q">&#39;EdgeCycle&#39;</span><span class="cm">,</span> <span class="q">&#39;SizeGreaterThan&#39;</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span>
+2684 <span class="s">}</span>
+2685 
+2686 <span class="c"># Get size of specified cycle type...</span>
+2687 <span class="c">#</span>
+<a name="_GetCycleSize-"></a>2688 <span class="k">sub </span><span class="m">_GetCycleSize</span> <span class="s">{</span>
+2689   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2690   <span class="k">my</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="cm">,</span> <span class="i">$CyclicPath</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span><span class="sc">;</span>
+2691 
+2692   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2693     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2694   <span class="s">}</span>
+2695   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^VertexCycle$/i</span><span class="s">)</span> <span class="s">{</span>
+2696     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertexProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2697       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2698     <span class="s">}</span>
+2699   <span class="s">}</span>
+2700   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^EdgeCycle$/i</span><span class="s">)</span> <span class="s">{</span>
+2701     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasEdgeProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2702       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2703     <span class="s">}</span>
+2704   <span class="s">}</span>
+2705 
+2706   <span class="j">MODE:</span> <span class="s">{</span>
+2707       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^GraphCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+2708       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^VertexCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetVertexProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+2709       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^EdgeCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetEdgeProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+2710       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2711   <span class="s">}</span>
+2712 
+2713   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2714     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2715   <span class="s">}</span>
+2716 
+2717   <span class="j">CYCLESIZE:</span> <span class="s">{</span>
+2718       <span class="k">if</span> <span class="s">(</span><span class="i">$CycleSize</span> =~ <span class="q">/^SmallestCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$CyclicPath</span> = <span class="i">$ActiveCyclicPathsRef</span>-&gt;[<span class="n">0</span>]<span class="sc">;</span> <span class="k">last</span> <span class="j">CYCLESIZE</span><span class="sc">;</span> <span class="s">}</span>
+2719       <span class="k">if</span> <span class="s">(</span><span class="i">$CycleSize</span> =~ <span class="q">/^LargestCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$CyclicPath</span> = <span class="i">$ActiveCyclicPathsRef</span>-&gt;[<span class="i">$#</span>{<span class="i">$ActiveCyclicPathsRef</span>}]<span class="sc">;</span> <span class="k">last</span> <span class="j">CYCLESIZE</span><span class="sc">;</span> <span class="s">}</span>
+2720       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2721   <span class="s">}</span>
+2722   <span class="i">$Size</span> = <span class="i">$CyclicPath</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span> - <span class="n">1</span><span class="sc">;</span>
+2723 
+2724   <span class="k">return</span> <span class="i">$Size</span><span class="sc">;</span>
+2725 <span class="s">}</span>
+2726 
+2727 <span class="c"># Get of specified cycle size...</span>
+2728 <span class="c">#</span>
+<a name="_GetCycle-"></a>2729 <span class="k">sub </span><span class="m">_GetCycle</span> <span class="s">{</span>
+2730   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2731   <span class="k">my</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="cm">,</span> <span class="i">$CyclicPath</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span><span class="sc">;</span>
+2732 
+2733   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2734     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2735   <span class="s">}</span>
+2736   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^VertexCycle$/i</span><span class="s">)</span> <span class="s">{</span>
+2737     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertexProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2738       <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2739     <span class="s">}</span>
+2740   <span class="s">}</span>
+2741   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^EdgeCycle$/i</span><span class="s">)</span> <span class="s">{</span>
+2742     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasEdgeProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2743       <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2744     <span class="s">}</span>
+2745   <span class="s">}</span>
+2746 
+2747   <span class="j">MODE:</span> <span class="s">{</span>
+2748       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^GraphCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+2749       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^VertexCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetVertexProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+2750       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^EdgeCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetEdgeProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+2751       <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2752   <span class="s">}</span>
+2753 
+2754   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2755     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2756   <span class="s">}</span>
+2757 
+2758   <span class="j">CYCLESIZE:</span> <span class="s">{</span>
+2759       <span class="k">if</span> <span class="s">(</span><span class="i">$CycleSize</span> =~ <span class="q">/^SmallestCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$CyclicPath</span> = <span class="i">$ActiveCyclicPathsRef</span>-&gt;[<span class="n">0</span>]<span class="sc">;</span> <span class="k">last</span> <span class="j">CYCLESIZE</span><span class="sc">;</span> <span class="s">}</span>
+2760       <span class="k">if</span> <span class="s">(</span><span class="i">$CycleSize</span> =~ <span class="q">/^LargestCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$CyclicPath</span> = <span class="i">$ActiveCyclicPathsRef</span>-&gt;[<span class="i">$#</span>{<span class="i">$ActiveCyclicPathsRef</span>}]<span class="sc">;</span> <span class="k">last</span> <span class="j">CYCLESIZE</span><span class="sc">;</span> <span class="s">}</span>
+2761       <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2762   <span class="s">}</span>
+2763   <span class="k">return</span> <span class="i">$CyclicPath</span><span class="sc">;</span>
+2764 <span class="s">}</span>
+2765 
+2766 <span class="c"># Get num of cycles in graph...</span>
+2767 <span class="c">#</span>
+<a name="_GetNumOfCyclesWithSize-"></a>2768 <span class="k">sub </span><span class="m">_GetNumOfCyclesWithSize</span> <span class="s">{</span>
+2769   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="cm">,</span> <span class="i">$SizeMode</span><span class="cm">,</span> <span class="i">$SpecifiedSize</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2770   <span class="k">my</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span><span class="sc">;</span>
+2771 
+2772   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2773     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2774   <span class="s">}</span>
+2775   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^VertexCycle$/i</span><span class="s">)</span> <span class="s">{</span>
+2776     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertexProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2777       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2778     <span class="s">}</span>
+2779   <span class="s">}</span>
+2780   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^EdgeCycle$/i</span><span class="s">)</span> <span class="s">{</span>
+2781     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasEdgeProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2782       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2783     <span class="s">}</span>
+2784   <span class="s">}</span>
+2785 
+2786   <span class="k">if</span> <span class="s">(</span><span class="i">$SizeMode</span> =~ <span class="q">/^(SizeLessThan|SizeGreaterThan|SpecifiedSize)$/i</span><span class="s">)</span> <span class="s">{</span>
+2787     <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$SpecifiedSize</span><span class="s">)</span> <span class="s">{</span>
+2788       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_GetNumOfCyclesWithSize: Cycle size muse be defined...&quot;</span><span class="sc">;</span>
+2789       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2790     <span class="s">}</span>
+2791     <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedSize</span> &lt; <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
+2792       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_GetNumOfCyclesWithSize: Specified cycle size, $SpecifiedSize, must be &gt; 0 ...&quot;</span><span class="sc">;</span>
+2793       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2794     <span class="s">}</span>
+2795   <span class="s">}</span>
+2796 
+2797   <span class="j">MODE:</span> <span class="s">{</span>
+2798       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^GraphCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+2799       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^VertexCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetVertexProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+2800       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^EdgeCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetEdgeProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+2801       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2802   <span class="s">}</span>
+2803 
+2804   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2805     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2806   <span class="s">}</span>
+2807   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfCycles</span><span class="s">)</span><span class="sc">;</span>
+2808 
+2809   <span class="i">$NumOfCycles</span> = <span class="i">$This</span><span class="i">-&gt;_GetCycles</span><span class="s">(</span><span class="i">$Mode</span><span class="cm">,</span> <span class="i">$ActiveCyclicPathsRef</span><span class="cm">,</span> <span class="i">$SizeMode</span><span class="cm">,</span> <span class="i">$SpecifiedSize</span><span class="s">)</span><span class="sc">;</span>
+2810 
+2811   <span class="k">return</span> <span class="i">$NumOfCycles</span><span class="sc">;</span>
+2812 <span class="s">}</span>
+2813 
+2814 <span class="c"># Get cycles in graph...</span>
+2815 <span class="c">#</span>
+<a name="_GetCyclesWithSize-"></a>2816 <span class="k">sub </span><span class="m">_GetCyclesWithSize</span> <span class="s">{</span>
+2817   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="cm">,</span> <span class="i">$SizeMode</span><span class="cm">,</span> <span class="i">$SpecifiedSize</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2818   <span class="k">my</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span><span class="sc">;</span>
+2819 
+2820   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2821     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2822   <span class="s">}</span>
+2823   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^VertexCycle$/i</span><span class="s">)</span> <span class="s">{</span>
+2824     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasVertexProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2825       <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2826     <span class="s">}</span>
+2827   <span class="s">}</span>
+2828   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^EdgeCycle$/i</span><span class="s">)</span> <span class="s">{</span>
+2829     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;HasEdgeProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2830       <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2831     <span class="s">}</span>
+2832   <span class="s">}</span>
+2833 
+2834   <span class="k">if</span> <span class="s">(</span><span class="i">$SizeMode</span> =~ <span class="q">/^(SizeLessThan|SizeGreaterThan|SpecifiedSize)$/i</span><span class="s">)</span> <span class="s">{</span>
+2835     <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$SpecifiedSize</span><span class="s">)</span> <span class="s">{</span>
+2836       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_GetCyclesWithSize: Cycle size must be defined...&quot;</span><span class="sc">;</span>
+2837       <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2838     <span class="s">}</span>
+2839     <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedSize</span> &lt; <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
+2840       <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;_GetCyclesWithSize: Specified cycle size, $SpecifiedSize, must be &gt; 0 ...&quot;</span><span class="sc">;</span>
+2841       <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2842     <span class="s">}</span>
+2843   <span class="s">}</span>
+2844 
+2845   <span class="j">MODE:</span> <span class="s">{</span>
+2846       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^GraphCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetGraphProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+2847       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^VertexCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetVertexProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+2848       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^EdgeCycle$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">-&gt;GetEdgeProperty</span><span class="s">(</span><span class="q">&#39;ActiveCyclicPaths&#39;</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="cm">,</span> <span class="i">$VertexID2</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+2849       <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2850     <span class="s">}</span>
+2851 
+2852   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2853     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2854   <span class="s">}</span>
+2855   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetCycles</span><span class="s">(</span><span class="i">$Mode</span><span class="cm">,</span> <span class="i">$ActiveCyclicPathsRef</span><span class="cm">,</span> <span class="i">$SizeMode</span><span class="cm">,</span> <span class="i">$SpecifiedSize</span><span class="s">)</span><span class="sc">;</span>
+2856 <span class="s">}</span>
+2857 
+2858 <span class="c"># Get cycles information...</span>
+2859 <span class="c">#</span>
+<a name="_GetCycles-"></a>2860 <span class="k">sub </span><span class="m">_GetCycles</span> <span class="s">{</span>
+2861   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="cm">,</span> <span class="i">$ActiveCyclicPathsRef</span><span class="cm">,</span> <span class="i">$SizeMode</span><span class="cm">,</span> <span class="i">$SpecifiedSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2862 
+2863   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2864     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2865   <span class="s">}</span>
+2866 
+2867   <span class="k">if</span> <span class="s">(</span><span class="i">$SizeMode</span> =~ <span class="q">/^AllSizes$/i</span><span class="s">)</span> <span class="s">{</span>
+2868     <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>} <span class="co">:</span> <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="sc">;</span>
+2869   <span class="s">}</span>
+2870 
+2871   <span class="c"># Get appropriate cycles...</span>
+2872   <span class="k">my</span><span class="s">(</span><span class="i">$Size</span><span class="cm">,</span> <span class="i">$CyclicPath</span><span class="cm">,</span> <span class="i">@FilteredCyclicPaths</span><span class="s">)</span><span class="sc">;</span>
+2873   <span class="i">@FilteredCyclicPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2874 
+2875   <span class="k">for</span> <span class="i">$CyclicPath</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ActiveCyclicPathsRef</span>}<span class="s">)</span> <span class="s">{</span>
+2876     <span class="i">$Size</span> = <span class="i">$CyclicPath</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span> - <span class="n">1</span><span class="sc">;</span>
+2877     <span class="j">SIZEMODE:</span> <span class="s">{</span>
+2878       <span class="k">if</span> <span class="s">(</span><span class="i">$SizeMode</span> =~ <span class="q">/^OddSize$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">if</span> <span class="s">(</span><span class="i">$Size</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span> <span class="k">push</span> <span class="i">@FilteredCyclicPaths</span><span class="cm">,</span> <span class="i">$CyclicPath</span><span class="sc">;</span> <span class="s">}</span> <span class="k">last</span> <span class="j">SIZEMODE</span><span class="sc">;</span> <span class="s">}</span>
+2879       <span class="k">if</span> <span class="s">(</span><span class="i">$SizeMode</span> =~ <span class="q">/^EvenSize$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$Size</span> % <span class="n">2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> <span class="k">push</span> <span class="i">@FilteredCyclicPaths</span><span class="cm">,</span> <span class="i">$CyclicPath</span><span class="sc">;</span> <span class="s">}</span> <span class="k">last</span> <span class="j">SIZEMODE</span><span class="sc">;</span> <span class="s">}</span>
+2880       <span class="k">if</span> <span class="s">(</span><span class="i">$SizeMode</span> =~ <span class="q">/^SizeLessThan$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">if</span> <span class="s">(</span><span class="i">$Size</span> &lt; <span class="i">$SpecifiedSize</span><span class="s">)</span> <span class="s">{</span> <span class="k">push</span> <span class="i">@FilteredCyclicPaths</span><span class="cm">,</span> <span class="i">$CyclicPath</span><span class="sc">;</span> <span class="s">}</span> <span class="k">last</span> <span class="j">SIZEMODE</span><span class="sc">;</span> <span class="s">}</span>
+2881       <span class="k">if</span> <span class="s">(</span><span class="i">$SizeMode</span> =~ <span class="q">/^SizeGreaterThan$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">if</span> <span class="s">(</span><span class="i">$Size</span> &gt; <span class="i">$SpecifiedSize</span><span class="s">)</span> <span class="s">{</span> <span class="k">push</span> <span class="i">@FilteredCyclicPaths</span><span class="cm">,</span> <span class="i">$CyclicPath</span><span class="sc">;</span> <span class="s">}</span> <span class="k">last</span> <span class="j">SIZEMODE</span><span class="sc">;</span> <span class="s">}</span>
+2882       <span class="k">if</span> <span class="s">(</span><span class="i">$SizeMode</span> =~ <span class="q">/^SpecifiedSize$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">if</span> <span class="s">(</span><span class="i">$Size</span> == <span class="i">$SpecifiedSize</span><span class="s">)</span> <span class="s">{</span> <span class="k">push</span> <span class="i">@FilteredCyclicPaths</span><span class="cm">,</span> <span class="i">$CyclicPath</span><span class="sc">;</span> <span class="s">}</span> <span class="k">last</span> <span class="j">SIZEMODE</span><span class="sc">;</span> <span class="s">}</span>
+2883       <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
+2884     <span class="s">}</span>
+2885   <span class="s">}</span>
+2886   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@FilteredCyclicPaths</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@FilteredCyclicPaths</span><span class="sc">;</span>
+2887 <span class="s">}</span>
+2888 
+2889 <span class="c"># Return empty cyles array...</span>
+2890 <span class="c">#</span>
+<a name="_GetEmptyCycles-"></a>2891 <span class="k">sub </span><span class="m">_GetEmptyCycles</span> <span class="s">{</span>
+2892   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2893   <span class="k">my</span><span class="s">(</span><span class="i">@CyclicPaths</span><span class="s">)</span><span class="sc">;</span>
+2894 
+2895   <span class="i">@CyclicPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2896 
+2897   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@CyclicPaths</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@CyclicPaths</span><span class="sc">;</span>
+2898 <span class="s">}</span>
+2899 
+2900 <span class="c"># Does graph contains fused cycles?</span>
+<a name="HasFusedCycles-"></a>2901 <span class="k">sub </span><span class="m">HasFusedCycles</span> <span class="s">{</span>
+2902   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2903 
+2904   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;HasGraphProperty</span><span class="s">(</span><span class="q">&#39;FusedActiveCyclicPaths&#39;</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+2905 <span class="s">}</span>
+2906 
+2907 <span class="c"># Return a reference to fused cycle sets lists containing references to lists of cyclic path objects</span>
+2908 <span class="c"># in each fused cycle set and a reference to a list containing non-fused cyclic paths...</span>
+2909 <span class="c">#</span>
+<a name="GetFusedAndNonFusedCycles-"></a>2910 <span class="k">sub </span><span class="m">GetFusedAndNonFusedCycles</span> <span class="s">{</span>
+2911   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2912   <span class="k">my</span><span class="s">(</span><span class="i">$FusedCycleSetsRef</span><span class="cm">,</span> <span class="i">$NonFusedCyclesRef</span><span class="s">)</span><span class="sc">;</span>
+2913 
+2914   <span class="i">$FusedCycleSetsRef</span> = <span class="i">$This</span><span class="i">-&gt;HasGraphProperty</span><span class="s">(</span><span class="q">&#39;FusedActiveCyclicPaths&#39;</span><span class="s">)</span> ? <span class="i">$This</span><span class="i">-&gt;GetGraphProperty</span><span class="s">(</span><span class="q">&#39;FusedActiveCyclicPaths&#39;</span><span class="s">)</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span>
+2915   <span class="i">$NonFusedCyclesRef</span> = <span class="i">$This</span><span class="i">-&gt;HasGraphProperty</span><span class="s">(</span><span class="q">&#39;NonFusedActiveCyclicPaths&#39;</span><span class="s">)</span> ? <span class="i">$This</span><span class="i">-&gt;GetGraphProperty</span><span class="s">(</span><span class="q">&#39;NonFusedActiveCyclicPaths&#39;</span><span class="s">)</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span>
+2916 
+2917   <span class="k">return</span> <span class="s">(</span><span class="i">$FusedCycleSetsRef</span><span class="cm">,</span> <span class="i">$NonFusedCyclesRef</span><span class="s">)</span><span class="sc">;</span>
+2918 <span class="s">}</span>
+2919 
+2920 <span class="c"># Get vertices of connected components as a list containing references to</span>
+2921 <span class="c"># lists of vertices for each component  sorted in order of its decreasing size...</span>
+2922 <span class="c">#</span>
+<a name="GetConnectedComponentsVertices-"></a>2923 <span class="k">sub </span><span class="m">GetConnectedComponentsVertices</span> <span class="s">{</span>
+2924   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2925   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+2926 
+2927   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+2928   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformDepthFirstSearch</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2929 
+2930   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2931 <span class="s">}</span>
+2932 
+2933 <span class="c"># Get a list of topologically sorted vertrices starting from a specified vertex or</span>
+2934 <span class="c"># an arbitrary vertex in the graph...</span>
+2935 <span class="c">#</span>
+<a name="GetTopologicallySortedVertices-"></a>2936 <span class="k">sub </span><span class="m">GetTopologicallySortedVertices</span> <span class="s">{</span>
+2937   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RootVertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2938   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+2939 
+2940   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+2941   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformBreadthFirstSearch</span><span class="s">(</span><span class="i">$RootVertexID</span><span class="s">)</span><span class="sc">;</span>
+2942 
+2943   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2944 <span class="s">}</span>
+2945 
+2946 <span class="c"># Get a list of paths starting from a specified vertex with length upto specified length</span>
+2947 <span class="c"># and no sharing of edges in paths traversed. By default, cycles are included in paths.</span>
+2948 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span>
+2949 <span class="c">#</span>
+<a name="GetPathsStartingAtWithLengthUpto-"></a>2950 <span class="k">sub </span><span class="m">GetPathsStartingAtWithLengthUpto</span> <span class="s">{</span>
+2951   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2952   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+2953 
+2954   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+2955   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformPathsSearchWithLengthUpto</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span>
+2956 
+2957   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2958 <span class="s">}</span>
+2959 
+2960 <span class="c"># Get a list of paths starting from a specified vertex with specified length</span>
+2961 <span class="c"># and no sharing of edges in paths traversed. By default, cycles are included in paths.</span>
+2962 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span>
+2963 <span class="c">#</span>
+<a name="GetPathsStartingAtWithLength-"></a>2964 <span class="k">sub </span><span class="m">GetPathsStartingAtWithLength</span> <span class="s">{</span>
+2965   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2966   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+2967 
+2968   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+2969   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformPathsSearchWithLength</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span>
+2970 
+2971   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2972 <span class="s">}</span>
+2973 
+2974 <span class="c"># Get a list of paths with all possible lengths starting from a specified vertex</span>
+2975 <span class="c"># with no sharing of edges in paths traversed. By default, cycles are included in paths.</span>
+2976 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span>
+2977 <span class="c">#</span>
+<a name="GetPathsStartingAt-"></a>2978 <span class="k">sub </span><span class="m">GetPathsStartingAt</span> <span class="s">{</span>
+2979   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2980   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+2981 
+2982   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+2983   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformPathsSearch</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span>
+2984 
+2985   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2986 <span class="s">}</span>
+2987 
+2988 <span class="c"># Get a list of all paths starting from a specified vertex with length upto a specified length</span>
+2989 <span class="c"># with sharing of edges in paths traversed. By default, cycles are included in paths.</span>
+2990 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span>
+2991 <span class="c">#</span>
+<a name="GetAllPathsStartingAtWithLengthUpto-"></a>2992 <span class="k">sub </span><span class="m">GetAllPathsStartingAtWithLengthUpto</span> <span class="s">{</span>
+2993   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2994   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+2995 
+2996   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+2997   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformAllPathsSearchWithLengthUpto</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span>
+2998 
+2999   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3000 <span class="s">}</span>
+3001 
+3002 <span class="c"># Get a list of all paths starting from a specified vertex with specified length</span>
+3003 <span class="c"># with sharing of edges in paths traversed. By default, cycles are included in paths.</span>
+3004 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span>
+3005 <span class="c">#</span>
+<a name="GetAllPathsStartingAtWithLength-"></a>3006 <span class="k">sub </span><span class="m">GetAllPathsStartingAtWithLength</span> <span class="s">{</span>
+3007   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3008   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+3009 
+3010   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3011   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformAllPathsSearchWithLength</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span>
+3012 
+3013   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3014 <span class="s">}</span>
+3015 
+3016 
+3017 <span class="c"># Get a list of all paths with all possible lengths starting from a specified vertex</span>
+3018 <span class="c"># with sharing of edges in paths traversed. By default, cycles are included in paths.</span>
+3019 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span>
+3020 <span class="c">#</span>
+<a name="GetAllPathsStartingAt-"></a>3021 <span class="k">sub </span><span class="m">GetAllPathsStartingAt</span> <span class="s">{</span>
+3022   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3023   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+3024 
+3025   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3026   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformAllPathsSearch</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span>
+3027 
+3028   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3029 <span class="s">}</span>
+3030 
+3031 <span class="c"># Get a reference to list of paths starting from each vertex in graph with length upto specified</span>
+3032 <span class="c"># length and no sharing of edges in paths traversed. By default, cycles are included in paths.</span>
+3033 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span>
+3034 <span class="c">#</span>
+<a name="GetPathsWithLengthUpto-"></a>3035 <span class="k">sub </span><span class="m">GetPathsWithLengthUpto</span> <span class="s">{</span>
+3036   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3037 
+3038   <span class="i">$AllowCycles</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$AllowCycles</span><span class="s">)</span> ? <span class="i">$AllowCycles</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+3039 
+3040   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetPaths</span><span class="s">(</span><span class="q">&#39;PathsWithLengthUpto&#39;</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span>
+3041 <span class="s">}</span>
+3042 
+3043 <span class="c"># Get a reference to list of paths starting from each vertex in graph with specified</span>
+3044 <span class="c"># length and no sharing of edges in paths traversed. By default, cycles are included in paths.</span>
+3045 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span>
+3046 <span class="c">#</span>
+<a name="GetPathsWithLength-"></a>3047 <span class="k">sub </span><span class="m">GetPathsWithLength</span> <span class="s">{</span>
+3048   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3049 
+3050   <span class="i">$AllowCycles</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$AllowCycles</span><span class="s">)</span> ? <span class="i">$AllowCycles</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+3051 
+3052   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetPaths</span><span class="s">(</span><span class="q">&#39;PathsWithLength&#39;</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span>
+3053 <span class="s">}</span>
+3054 
+3055 <span class="c"># Get a reference to list of paths with all possible lengths starting from each vertex</span>
+3056 <span class="c"># with no sharing of edges in paths traversed. By default, cycles are included in paths.</span>
+3057 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span>
+3058 <span class="c">#</span>
+3059 <span class="c">#</span>
+<a name="GetPaths-"></a>3060 <span class="k">sub </span><span class="m">GetPaths</span> <span class="s">{</span>
+3061   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3062 
+3063   <span class="i">$AllowCycles</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$AllowCycles</span><span class="s">)</span> ? <span class="i">$AllowCycles</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+3064 
+3065   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetPaths</span><span class="s">(</span><span class="q">&#39;PathsWithAllLengths&#39;</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span>
+3066 <span class="s">}</span>
+3067 
+3068 <span class="c"># Get a reference to list of all paths starting from each vertex in graph with length upto a specified</span>
+3069 <span class="c"># length with sharing of edges in paths traversed. By default, cycles are included in paths. A path</span>
+3070 <span class="c"># containing a cycle is terminated at a vertex completing the cycle.</span>
+3071 <span class="c">#</span>
+3072 <span class="c"># Note:</span>
+3073 <span class="c">#   . Duplicate paths are not removed.</span>
+3074 <span class="c">#</span>
+<a name="GetAllPathsWithLengthUpto-"></a>3075 <span class="k">sub </span><span class="m">GetAllPathsWithLengthUpto</span> <span class="s">{</span>
+3076   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3077 
+3078   <span class="i">$AllowCycles</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$AllowCycles</span><span class="s">)</span> ? <span class="i">$AllowCycles</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+3079 
+3080   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetPaths</span><span class="s">(</span><span class="q">&#39;AllPathsWithLengthUpto&#39;</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span>
+3081 <span class="s">}</span>
+3082 
+3083 <span class="c"># Get a reference to list of all paths starting from each vertex in graph with specified</span>
+3084 <span class="c"># length with sharing of edges in paths traversed. By default, cycles are included in paths. A path</span>
+3085 <span class="c"># containing a cycle is terminated at a vertex completing the cycle.</span>
+3086 <span class="c">#</span>
+3087 <span class="c"># Note:</span>
+3088 <span class="c">#   . Duplicate paths are not removed.</span>
+3089 <span class="c">#</span>
+<a name="GetAllPathsWithLength-"></a>3090 <span class="k">sub </span><span class="m">GetAllPathsWithLength</span> <span class="s">{</span>
+3091   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3092 
+3093   <span class="i">$AllowCycles</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$AllowCycles</span><span class="s">)</span> ? <span class="i">$AllowCycles</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+3094 
+3095   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetPaths</span><span class="s">(</span><span class="q">&#39;AllPathsWithLength&#39;</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span>
+3096 <span class="s">}</span>
+3097 
+3098 <span class="c"># Get a reference to list of all paths with all possible lengths starting from each vertex in graph</span>
+3099 <span class="c"># with sharing of edges in paths traversed. By default, cycles are included in paths. A path</span>
+3100 <span class="c"># containing a cycle is terminated at a vertex completing the cycle.</span>
+3101 <span class="c">#</span>
+3102 <span class="c"># Note:</span>
+3103 <span class="c">#   . Duplicate paths are not removed.</span>
+3104 <span class="c">#</span>
+<a name="GetAllPaths-"></a>3105 <span class="k">sub </span><span class="m">GetAllPaths</span> <span class="s">{</span>
+3106   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3107 
+3108   <span class="i">$AllowCycles</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$AllowCycles</span><span class="s">)</span> ? <span class="i">$AllowCycles</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+3109 
+3110   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetPaths</span><span class="s">(</span><span class="q">&#39;AllPathsWithAllLengths&#39;</span><span class="cm">,</span> <span class="k">undef</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span>
+3111 <span class="s">}</span>
+3112 
+3113 
+3114 <span class="c"># Retrieve appropriate paths for each vertex in graph and return a referernce to list</span>
+3115 <span class="c"># containing path objects...</span>
+3116 <span class="c">#</span>
+<a name="_GetPaths-"></a>3117 <span class="k">sub </span><span class="m">_GetPaths</span> <span class="s">{</span>
+3118   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3119   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">@EmptyPaths</span><span class="cm">,</span> <span class="i">@Paths</span><span class="s">)</span><span class="sc">;</span>
+3120 
+3121   <span class="i">@Paths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@EmptyPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3122 
+3123   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+3124     <span class="k">my</span><span class="s">(</span><span class="i">$Status</span><span class="cm">,</span> <span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+3125 
+3126     <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3127     <span class="j">MODE:</span> <span class="s">{</span>
+3128       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^PathsWithLengthUpto$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$Status</span> = <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformPathsSearchWithLengthUpto</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+3129       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^PathsWithLength$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$Status</span> = <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformPathsSearchWithLength</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+3130       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^PathsWithAllLengths$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$Status</span> = <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformPathsSearch</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+3131 
+3132       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AllPathsWithLengthUpto$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$Status</span> = <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformAllPathsSearchWithLengthUpto</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+3133       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AllPathsWithLength$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$Status</span> = <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformAllPathsSearchWithLength</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$Length</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+3134       <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AllPathsWithAllLengths$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">$Status</span> = <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformAllPathsSearch</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$AllowCycles</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
+3135 
+3136       <span class="k">return</span> \<span class="i">@EmptyPaths</span><span class="sc">;</span>
+3137     <span class="s">}</span>
+3138     <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Status</span><span class="s">)</span> <span class="s">{</span>
+3139       <span class="k">return</span> \<span class="i">@EmptyPaths</span><span class="sc">;</span>
+3140     <span class="s">}</span>
+3141     <span class="k">push</span> <span class="i">@Paths</span><span class="cm">,</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3142   <span class="s">}</span>
+3143   <span class="k">return</span> \<span class="i">@Paths</span><span class="sc">;</span>
+3144 <span class="s">}</span>
+3145 
+3146 <span class="c"># Get a list of paths between two vertices. For cyclic graphs, the list contains</span>
+3147 <span class="c"># may contain two paths...</span>
+3148 <span class="c">#</span>
+<a name="GetPathsBetween-"></a>3149 <span class="k">sub </span><span class="m">GetPathsBetween</span> <span class="s">{</span>
+3150   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$EndVertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3151   <span class="k">my</span><span class="s">(</span><span class="i">$Path</span><span class="cm">,</span> <span class="i">$ReversePath</span><span class="cm">,</span> <span class="i">@Paths</span><span class="s">)</span><span class="sc">;</span>
+3152 
+3153   <span class="i">@Paths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3154 
+3155   <span class="i">$Path</span> = <span class="i">$This</span><span class="i">-&gt;_GetPathBetween</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$EndVertexID</span><span class="s">)</span><span class="sc">;</span>
+3156   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Path</span><span class="s">)</span> <span class="s">{</span>
+3157     <span class="k">return</span> \<span class="i">@Paths</span><span class="sc">;</span>
+3158   <span class="s">}</span>
+3159 
+3160   <span class="i">$ReversePath</span> = <span class="i">$This</span><span class="i">-&gt;_GetPathBetween</span><span class="s">(</span><span class="i">$EndVertexID</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="s">)</span><span class="sc">;</span>
+3161   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$ReversePath</span><span class="s">)</span> <span class="s">{</span>
+3162     <span class="k">return</span> \<span class="i">@Paths</span><span class="sc">;</span>
+3163   <span class="s">}</span>
+3164   <span class="k">if</span> <span class="s">(</span><span class="i">$Path</span> <span class="k">eq</span> <span class="i">$ReversePath</span><span class="s">)</span> <span class="s">{</span>
+3165     <span class="k">push</span> <span class="i">@Paths</span><span class="cm">,</span> <span class="i">$Path</span><span class="sc">;</span>
+3166   <span class="s">}</span>
+3167   <span class="k">else</span> <span class="s">{</span>
+3168     <span class="c"># Make sure first vertex in reverse path corresponds to specified start vertex ID...</span>
+3169     <span class="i">$ReversePath</span><span class="i">-&gt;Reverse</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3170     <span class="k">push</span> <span class="i">@Paths</span><span class="cm">,</span> <span class="s">(</span><span class="i">$Path</span><span class="i">-&gt;GetLength</span> &lt;= <span class="i">$ReversePath</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> ? <span class="s">(</span><span class="i">$Path</span><span class="cm">,</span> <span class="i">$ReversePath</span><span class="s">)</span> <span class="co">:</span> <span class="s">(</span><span class="i">$ReversePath</span><span class="cm">,</span> <span class="i">$Path</span><span class="s">)</span><span class="sc">;</span>
+3171   <span class="s">}</span>
+3172   <span class="k">return</span> <span class="i">@Paths</span><span class="sc">;</span>
+3173 <span class="s">}</span>
+3174 
+3175 <span class="c"># Get a path beween two vertices...</span>
+3176 <span class="c">#</span>
+<a name="_GetPathBetween-"></a>3177 <span class="k">sub </span><span class="m">_GetPathBetween</span> <span class="s">{</span>
+3178   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$EndVertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3179   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="cm">,</span>  <span class="i">@Paths</span><span class="s">)</span><span class="sc">;</span>
+3180 
+3181   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3182   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformPathsSearchBetween</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$EndVertexID</span><span class="s">)</span><span class="sc">;</span>
+3183 
+3184   <span class="i">@Paths</span> = <span class="i">$PathsTraversal</span><span class="i">-&gt;GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3185 
+3186   <span class="k">return</span> <span class="s">(</span><span class="i">@Paths</span><span class="s">)</span> ? <span class="i">$Paths</span>[<span class="n">0</span>] <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span>
+3187 <span class="s">}</span>
+3188 
+3189 <span class="c"># Get a list containing lists of neighborhood vertices around a specified vertex with in a</span>
+3190 <span class="c"># specified radius...</span>
+3191 <span class="c">#</span>
+<a name="GetNeighborhoodVerticesWithRadiusUpto-"></a>3192 <span class="k">sub </span><span class="m">GetNeighborhoodVerticesWithRadiusUpto</span> <span class="s">{</span>
+3193   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$Radius</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3194   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+3195 
+3196   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3197   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformNeighborhoodVerticesSearchWithRadiusUpto</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$Radius</span><span class="s">)</span><span class="sc">;</span>
+3198 
+3199   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetVerticesNeighborhoods</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3200 <span class="s">}</span>
+3201 
+3202 <span class="c"># Get a list containing lists of neighborhood vertices around a specified vertex at all</span>
+3203 <span class="c"># radii levels...</span>
+3204 <span class="c">#</span>
+<a name="GetNeighborhoodVertices-"></a>3205 <span class="k">sub </span><span class="m">GetNeighborhoodVertices</span> <span class="s">{</span>
+3206   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3207   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+3208 
+3209   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3210   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformNeighborhoodVerticesSearch</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="s">)</span><span class="sc">;</span>
+3211 
+3212   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetVerticesNeighborhoods</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3213 <span class="s">}</span>
+3214 
+3215 <span class="c"># Get neighborhood vertices around a specified vertex, along with their successor connected vertices, collected</span>
+3216 <span class="c"># with in a specified radius as a list containing references to lists with first value corresponding to vertex</span>
+3217 <span class="c"># ID and second value as reference to a list containing its successor connected vertices.</span>
+3218 <span class="c">#</span>
+3219 <span class="c"># For a neighborhood vertex at each radius level, the successor connected vertices correspond to the</span>
+3220 <span class="c"># neighborhood vertices at the next radius level. Consequently, the neighborhood vertices at the last</span>
+3221 <span class="c"># radius level don&#39;t contain any successor vertices which fall outside the range of specified radius.</span>
+3222 <span class="c">#</span>
+<a name="GetNeighborhoodVerticesWithSuccessorsAndRadiusUpto-"></a>3223 <span class="k">sub </span><span class="m">GetNeighborhoodVerticesWithSuccessorsAndRadiusUpto</span> <span class="s">{</span>
+3224   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$Radius</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3225   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+3226 
+3227   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3228   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformNeighborhoodVerticesSearchWithSuccessorsAndRadiusUpto</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="cm">,</span> <span class="i">$Radius</span><span class="s">)</span><span class="sc">;</span>
+3229 
+3230   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetVerticesNeighborhoodsWithSuccessors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3231 <span class="s">}</span>
+3232 
+3233 <span class="c"># Get neighborhood vertices around a specified vertex, along with their successor connected vertices, collected</span>
+3234 <span class="c"># at all neighborhood radii as a list containing references to lists with first value corresponding to vertex</span>
+3235 <span class="c"># ID and second value as reference to a list containing its successor connected vertices.</span>
+3236 <span class="c">#</span>
+3237 <span class="c"># For a neighborhood vertex at each radius level, the successor connected vertices correspond to the</span>
+3238 <span class="c"># neighborhood vertices at the next radius level. Consequently, the neighborhood vertices at the last</span>
+3239 <span class="c"># radius level don&#39;t contain any successor vertices which fall outside the range of specified radius.</span>
+3240 <span class="c">#</span>
+<a name="GetNeighborhoodVerticesWithSuccessors-"></a>3241 <span class="k">sub </span><span class="m">GetNeighborhoodVerticesWithSuccessors</span> <span class="s">{</span>
+3242   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$StartVertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3243   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span>
+3244 
+3245   <span class="i">$PathsTraversal</span> = <span class="i">new</span> <span class="i">Graph::PathsTraversal</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3246   <span class="i">$PathsTraversal</span><span class="i">-&gt;PerformNeighborhoodVerticesSearchWithSuccessors</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="s">)</span><span class="sc">;</span>
+3247 
+3248   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">-&gt;GetVerticesNeighborhoodsWithSuccessors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3249 <span class="s">}</span>
+3250 
+3251 <span class="c"># Get adjacency matrix for the graph as a Matrix object with row and column indices</span>
+3252 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span>
+3253 <span class="c">#</span>
+3254 <span class="c"># For a simple graph G with n vertices, the adjacency matrix for G is a n x n square matrix and</span>
+3255 <span class="c"># its elements Mij are:</span>
+3256 <span class="c">#</span>
+3257 <span class="c">#   . 0    if i == j</span>
+3258 <span class="c">#   . 1    if i != j and vertex Vi is adjacent to vertex Vj</span>
+3259 <span class="c">#   . 0    if i != j and vertex Vi is not adjacent to vertex Vj</span>
+3260 <span class="c">#</span>
+<a name="GetAdjacencyMatrix-"></a>3261 <span class="k">sub </span><span class="m">GetAdjacencyMatrix</span> <span class="s">{</span>
+3262   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3263   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span>
+3264 
+3265   <span class="i">$GraphMatrix</span> = <span class="i">new</span> <span class="i">Graph::GraphMatrix</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3266   <span class="i">$GraphMatrix</span><span class="i">-&gt;GenerateAdjacencyMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3267 
+3268   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">-&gt;GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3269 <span class="s">}</span>
+3270 
+3271 <span class="c"># Get Siedel adjacency matrix for the graph as a Matrix object with row and column indices</span>
+3272 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span>
+3273 <span class="c">#</span>
+3274 <span class="c"># For a simple graph G with n vertices, the Siedal adjacency matrix for G is a n x n square matrix and</span>
+3275 <span class="c"># its elements Mij are:</span>
+3276 <span class="c">#</span>
+3277 <span class="c">#   . 0    if i == j</span>
+3278 <span class="c">#   . -1   if i != j and vertex Vi is adjacent to vertex Vj</span>
+3279 <span class="c">#   . 1    if i != j and vertex Vi is not adjacent to vertex Vj</span>
+3280 <span class="c">#</span>
+<a name="GetSiedelAdjacencyMatrix-"></a>3281 <span class="k">sub </span><span class="m">GetSiedelAdjacencyMatrix</span> <span class="s">{</span>
+3282   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3283   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span>
+3284 
+3285   <span class="i">$GraphMatrix</span> = <span class="i">new</span> <span class="i">Graph::GraphMatrix</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3286   <span class="i">$GraphMatrix</span><span class="i">-&gt;GenerateSiedelAdjacencyMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3287 
+3288   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">-&gt;GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3289 <span class="s">}</span>
+3290 
+3291 <span class="c"># Get distance matrix for the graph as a Matrix object with row and column indices</span>
+3292 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span>
+3293 <span class="c">#</span>
+3294 <span class="c"># For a simple graph G with n vertices, the distance matrix for G is a n x n square matrix and</span>
+3295 <span class="c"># its elements Mij are:</span>
+3296 <span class="c">#</span>
+3297 <span class="c">#   . 0    if i == j</span>
+3298 <span class="c">#   . d    if i != j and d is the shortest distance between vertex Vi and vertex Vj</span>
+3299 <span class="c">#</span>
+3300 <span class="c"># Note:</span>
+3301 <span class="c">#   . In the final matrix, BigNumber values correspond to vertices with no edges.</span>
+3302 <span class="c">#</span>
+<a name="GetDistanceMatrix-"></a>3303 <span class="k">sub </span><span class="m">GetDistanceMatrix</span> <span class="s">{</span>
+3304   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3305   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span>
+3306 
+3307   <span class="i">$GraphMatrix</span> = <span class="i">new</span> <span class="i">Graph::GraphMatrix</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3308   <span class="i">$GraphMatrix</span><span class="i">-&gt;GenerateDistanceMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3309 
+3310   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">-&gt;GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3311 <span class="s">}</span>
+3312 
+3313 <span class="c"># Get incidence matrix for the graph as a Matrix object with row and column indices</span>
+3314 <span class="c"># corresponding to graph vertices and edges returned by GetVertices and GetEdges</span>
+3315 <span class="c"># methods respectively.</span>
+3316 <span class="c">#</span>
+3317 <span class="c"># For a simple graph G with n vertices and e edges, the incidence matrix for G is a n x e matrix</span>
+3318 <span class="c"># its elements Mij are:</span>
+3319 <span class="c">#</span>
+3320 <span class="c">#   . 1    if vertex Vi and the edge Ej are incident; in other words, Vi and Ej are related</span>
+3321 <span class="c">#   . 0    otherwise</span>
+3322 <span class="c">#</span>
+<a name="GetIncidenceMatrix-"></a>3323 <span class="k">sub </span><span class="m">GetIncidenceMatrix</span> <span class="s">{</span>
+3324   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3325   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span>
+3326 
+3327   <span class="i">$GraphMatrix</span> = <span class="i">new</span> <span class="i">Graph::GraphMatrix</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3328   <span class="i">$GraphMatrix</span><span class="i">-&gt;GenerateIncidenceMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3329 
+3330   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">-&gt;GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3331 <span class="s">}</span>
+3332 
+3333 <span class="c"># Get degree matrix for the graph as a Matrix object with row and column indices</span>
+3334 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span>
+3335 <span class="c">#</span>
+3336 <span class="c"># For a simple graph G with n vertices, the degree matrix for G is a n x n square matrix and</span>
+3337 <span class="c"># its elements Mij are:</span>
+3338 <span class="c">#</span>
+3339 <span class="c">#   . deg(Vi)   if i == j and deg(Vi) is the degree of vertex Vi</span>
+3340 <span class="c">#   . 0         otherwise</span>
+3341 <span class="c">#</span>
+<a name="GetDegreeMatrix-"></a>3342 <span class="k">sub </span><span class="m">GetDegreeMatrix</span> <span class="s">{</span>
+3343   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3344   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span>
+3345 
+3346   <span class="i">$GraphMatrix</span> = <span class="i">new</span> <span class="i">Graph::GraphMatrix</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3347   <span class="i">$GraphMatrix</span><span class="i">-&gt;GenerateDegreeMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3348 
+3349   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">-&gt;GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3350 <span class="s">}</span>
+3351 
+3352 <span class="c"># Get Laplacian matrix for the graph as a Matrix object with row and column indices</span>
+3353 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span>
+3354 <span class="c">#</span>
+3355 <span class="c"># For a simple graph G with n vertices, the Laplacian matrix for G is a n x n square matrix and</span>
+3356 <span class="c"># its elements Mij are:</span>
+3357 <span class="c">#</span>
+3358 <span class="c">#   . deg(Vi)   if i == j and deg(Vi) is the degree of vertex Vi</span>
+3359 <span class="c">#   . -1        if i != j and vertex Vi is adjacent to vertex Vj</span>
+3360 <span class="c">#   . 0         otherwise</span>
+3361 <span class="c">#</span>
+3362 <span class="c"># Note: The Laplacian matrix is the difference between the degree matrix and adjacency matrix.</span>
+3363 <span class="c">#</span>
+<a name="GetLaplacianMatrix-"></a>3364 <span class="k">sub </span><span class="m">GetLaplacianMatrix</span> <span class="s">{</span>
+3365   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3366   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span>
+3367 
+3368   <span class="i">$GraphMatrix</span> = <span class="i">new</span> <span class="i">Graph::GraphMatrix</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3369   <span class="i">$GraphMatrix</span><span class="i">-&gt;GenerateLaplacianMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3370 
+3371   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">-&gt;GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3372 <span class="s">}</span>
+3373 
+3374 <span class="c"># Get normalized Laplacian matrix for the graph as a Matrix object with row and column indices</span>
+3375 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span>
+3376 <span class="c">#</span>
+3377 <span class="c"># For a simple graph G with n vertices, the normalized Laplacian matrix L for G is a n x n square matrix and</span>
+3378 <span class="c"># its elements Lij are:</span>
+3379 <span class="c">#</span>
+3380 <span class="c">#   . 1                           if i == j and deg(Vi) != 0</span>
+3381 <span class="c">#   . -1/SQRT(deg(Vi) * deg(Vj))  if i != j and vertex Vi is adjacent to vertex Vj</span>
+3382 <span class="c">#   . 0                           otherwise</span>
+3383 <span class="c">#</span>
+3384 <span class="c">#</span>
+<a name="GetNormalizedLaplacianMatrix-"></a>3385 <span class="k">sub </span><span class="m">GetNormalizedLaplacianMatrix</span> <span class="s">{</span>
+3386   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3387   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span>
+3388 
+3389   <span class="i">$GraphMatrix</span> = <span class="i">new</span> <span class="i">Graph::GraphMatrix</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+3390   <span class="i">$GraphMatrix</span><span class="i">-&gt;GenerateNormalizedLaplacianMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3391 
+3392   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">-&gt;GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3393 <span class="s">}</span>
+3394 
+3395 <span class="c"># Get admittance matrix for the graph as a Matrix object with row and column indices</span>
+3396 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span>
+3397 <span class="c">#</span>
+<a name="GetAdmittanceMatrix-"></a>3398 <span class="k">sub </span><span class="m">GetAdmittanceMatrix</span> <span class="s">{</span>
+3399   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3400 
+3401   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetLaplacianMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3402 <span class="s">}</span>
+3403 
+3404 <span class="c"># Get Kirchhoff matrix for the graph as a Matrix object with row and column indices</span>
+3405 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span>
+3406 <span class="c">#</span>
+<a name="GetKirchhoffMatrix-"></a>3407 <span class="k">sub </span><span class="m">GetKirchhoffMatrix</span> <span class="s">{</span>
+3408   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+3409 
+3410   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetLaplacianMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+3411 <span class="s">}</span>
+3412 
+<a name="EOF-"></a></pre>
+<p>&nbsp;</p>
+<br />
+<center>
+<img src="../../../images/h2o2.png">
+</center>
+</body>
+</html>