view 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 source

<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>