| 0 | 1 <html> | 
|  | 2 <head> | 
|  | 3 <title>MayaChemTools:Code:Graph.pm</title> | 
|  | 4 <meta http-equiv="content-type" content="text/html;charset=utf-8"> | 
|  | 5 <link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css"> | 
|  | 6 </head> | 
|  | 7 <body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10"> | 
|  | 8 <br/> | 
|  | 9 <center> | 
|  | 10 <a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a> | 
|  | 11 </center> | 
|  | 12 <br/> | 
|  | 13 <pre> | 
|  | 14 <a name="package-Graph-"></a>   1 <span class="k">package </span><span class="i">Graph</span><span class="sc">;</span> | 
|  | 15    2 <span class="c">#</span> | 
|  | 16    3 <span class="c"># $RCSfile: Graph.pm,v $</span> | 
|  | 17    4 <span class="c"># $Date: 2015/02/28 20:47:17 $</span> | 
|  | 18    5 <span class="c"># $Revision: 1.46 $</span> | 
|  | 19    6 <span class="c">#</span> | 
|  | 20    7 <span class="c"># Author: Manish Sud <msud@san.rr.com></span> | 
|  | 21    8 <span class="c">#</span> | 
|  | 22    9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span> | 
|  | 23   10 <span class="c">#</span> | 
|  | 24   11 <span class="c"># This file is part of MayaChemTools.</span> | 
|  | 25   12 <span class="c">#</span> | 
|  | 26   13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span> | 
|  | 27   14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span> | 
|  | 28   15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span> | 
|  | 29   16 <span class="c"># later version.</span> | 
|  | 30   17 <span class="c">#</span> | 
|  | 31   18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span> | 
|  | 32   19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span> | 
|  | 33   20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span> | 
|  | 34   21 <span class="c"># details.</span> | 
|  | 35   22 <span class="c">#</span> | 
|  | 36   23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span> | 
|  | 37   24 <span class="c"># along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or</span> | 
|  | 38   25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span> | 
|  | 39   26 <span class="c"># Boston, MA, 02111-1307, USA.</span> | 
|  | 40   27 <span class="c">#</span> | 
|  | 41   28 | 
|  | 42   29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span> | 
|  | 43   30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span> | 
|  | 44   31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span> | 
|  | 45   32 <span class="k">use</span> <span class="w">Storable</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 46   33 <span class="k">use</span> <span class="w">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 47   34 <span class="k">use</span> <span class="w">Graph::CyclesDetection</span><span class="sc">;</span> | 
|  | 48   35 <span class="k">use</span> <span class="w">Graph::PathsTraversal</span><span class="sc">;</span> | 
|  | 49   36 <span class="k">use</span> <span class="w">Graph::GraphMatrix</span><span class="sc">;</span> | 
|  | 50   37 | 
|  | 51   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> | 
|  | 52   39 | 
|  | 53   40 <span class="i">@ISA</span> = <span class="q">qw(Exporter)</span><span class="sc">;</span> | 
|  | 54   41 <span class="i">@EXPORT</span> = <span class="q">qw(IsGraph)</span><span class="sc">;</span> | 
|  | 55   42 <span class="i">@EXPORT_OK</span> = <span class="q">qw()</span><span class="sc">;</span> | 
|  | 56   43 | 
|  | 57   44 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span><span class="w">all</span>  <span class="cm">=></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> | 
|  | 58   45 | 
|  | 59   46 <span class="c"># Setup class variables...</span> | 
|  | 60   47 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="sc">;</span> | 
|  | 61   48 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 62   49 | 
|  | 63   50 <span class="c"># Overload Perl functions...</span> | 
|  | 64   51 <span class="k">use</span> <span class="w">overload</span> <span class="q">'""'</span> <span class="cm">=></span> <span class="q">'StringifyGraph'</span><span class="sc">;</span> | 
|  | 65   52 | 
|  | 66   53 <span class="c"># Class constructor...</span> | 
|  | 67 <a name="new-"></a>  54 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span> | 
|  | 68   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> | 
|  | 69   56 | 
|  | 70   57   <span class="c"># Initialize object...</span> | 
|  | 71   58   <span class="k">my</span> <span class="i">$This</span> = <span class="s">{</span><span class="s">}</span><span class="sc">;</span> | 
|  | 72   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> | 
|  | 73   60   <span class="i">$This</span><span class="i">->_InitializeGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 74   61 | 
|  | 75   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">->AddVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> <span class="s">}</span> | 
|  | 76   63 | 
|  | 77   64   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 78   65 <span class="s">}</span> | 
|  | 79   66 | 
|  | 80   67 <span class="c"># Initialize object data...</span> | 
|  | 81 <a name="_InitializeGraph-"></a>  68 <span class="k">sub </span><span class="m">_InitializeGraph</span> <span class="s">{</span> | 
|  | 82   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> | 
|  | 83   70 | 
|  | 84   71   <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Vertices</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 85   72 | 
|  | 86   73   <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Edges</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 87   74   <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 88   75   <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 89   76 | 
|  | 90   77   <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 91   78   <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Graph</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 92   79   <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 93   80   <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 94   81 <span class="s">}</span> | 
|  | 95   82 | 
|  | 96   83 <span class="c"># Initialize class ...</span> | 
|  | 97 <a name="_InitializeClass-"></a>  84 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span> | 
|  | 98   85   <span class="c">#Class name...</span> | 
|  | 99   86   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span> | 
|  | 100   87 <span class="s">}</span> | 
|  | 101   88 | 
|  | 102   89 <span class="c"># Add a vertex...</span> | 
|  | 103 <a name="AddVertex-"></a>  90 <span class="k">sub </span><span class="m">AddVertex</span> <span class="s">{</span> | 
|  | 104   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> | 
|  | 105   92 | 
|  | 106   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> | 
|  | 107   94     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddVertex: No vertex added: Vertex ID must be specified..."</span><span class="sc">;</span> | 
|  | 108   95     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 109   96   <span class="s">}</span> | 
|  | 110   97   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 111   98     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddVertex: Didn't add vertex $VertexID: Already exists in the graph..."</span><span class="sc">;</span> | 
|  | 112   99     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 113  100   <span class="s">}</span> | 
|  | 114  101 | 
|  | 115  102   <span class="i">$This</span>->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>} = <span class="i">$VertexID</span><span class="sc">;</span> | 
|  | 116  103 | 
|  | 117  104   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 118  105 <span class="s">}</span> | 
|  | 119  106 | 
|  | 120  107 <span class="c"># Add vertices to the graph and return graph...</span> | 
|  | 121 <a name="AddVertices-"></a> 108 <span class="k">sub </span><span class="m">AddVertices</span> <span class="s">{</span> | 
|  | 122  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> | 
|  | 123  110 | 
|  | 124  111   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 125  112     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddVertices: No vertices added: Vertices list is empty..."</span><span class="sc">;</span> | 
|  | 126  113     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 127  114   <span class="s">}</span> | 
|  | 128  115 | 
|  | 129  116   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 130  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> | 
|  | 131  118     <span class="i">$This</span><span class="i">->AddVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 132  119   <span class="s">}</span> | 
|  | 133  120 | 
|  | 134  121   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 135  122 <span class="s">}</span> | 
|  | 136  123 | 
|  | 137  124 <span class="c"># Delete a vertex...</span> | 
|  | 138 <a name="DeleteVertex-"></a> 125 <span class="k">sub </span><span class="m">DeleteVertex</span> <span class="s">{</span> | 
|  | 139  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> | 
|  | 140  127 | 
|  | 141  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> | 
|  | 142  129     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteVertex: No vertex deleted: Vertex ID must be specified..."</span><span class="sc">;</span> | 
|  | 143  130     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 144  131   <span class="s">}</span> | 
|  | 145  132   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 146  133     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteVertex: Didn't delete vertex $VertexID: Vertex $VertexID doesn't exist..."</span><span class="sc">;</span> | 
|  | 147  134     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 148  135   <span class="s">}</span> | 
|  | 149  136   <span class="i">$This</span><span class="i">->_DeleteVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 150  137 | 
|  | 151  138   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 152  139 <span class="s">}</span> | 
|  | 153  140 | 
|  | 154  141 <span class="c"># Delete vertex...</span> | 
|  | 155 <a name="_DeleteVertex-"></a> 142 <span class="k">sub </span><span class="m">_DeleteVertex</span> <span class="s">{</span> | 
|  | 156  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> | 
|  | 157  144 | 
|  | 158  145   <span class="c"># Delete corresponding edges; the corresponding edge properties are deleted during</span> | 
|  | 159  146   <span class="c"># edges deletetion...</span> | 
|  | 160  147   <span class="k">my</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 161  148   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetEdges</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 162  149   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 163  150     <span class="i">$This</span><span class="i">->DeleteEdges</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 164  151   <span class="s">}</span> | 
|  | 165  152 | 
|  | 166  153   <span class="c"># Delete the vertex and any properties associated with vertex...</span> | 
|  | 167  154   <span class="i">$This</span><span class="i">->DeleteVertexProperties</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 168  155   <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}<span class="sc">;</span> | 
|  | 169  156 <span class="s">}</span> | 
|  | 170  157 | 
|  | 171  158 <span class="c"># Delete vertices...</span> | 
|  | 172 <a name="DeleteVertices-"></a> 159 <span class="k">sub </span><span class="m">DeleteVertices</span> <span class="s">{</span> | 
|  | 173  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> | 
|  | 174  161 | 
|  | 175  162   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 176  163     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteVertices: No vertices deleted: Vertices list is empty..."</span><span class="sc">;</span> | 
|  | 177  164     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 178  165   <span class="s">}</span> | 
|  | 179  166   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 180  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> | 
|  | 181  168     <span class="i">$This</span><span class="i">->DeleteVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 182  169   <span class="s">}</span> | 
|  | 183  170 | 
|  | 184  171   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 185  172 <span class="s">}</span> | 
|  | 186  173 | 
|  | 187  174 <span class="c"># Get vertex data...</span> | 
|  | 188 <a name="GetVertex-"></a> 175 <span class="k">sub </span><span class="m">GetVertex</span> <span class="s">{</span> | 
|  | 189  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> | 
|  | 190  177 | 
|  | 191  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> | 
|  | 192  179     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 193  180   <span class="s">}</span> | 
|  | 194  181 | 
|  | 195  182   <span class="k">return</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> ? <span class="i">$This</span>->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>} <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 196  183 <span class="s">}</span> | 
|  | 197  184 | 
|  | 198  185 <span class="c"># Get data for all vertices or those specifed in the list. In scalar context, returned</span> | 
|  | 199  186 <span class="c"># the number of vertices found.</span> | 
|  | 200  187 <span class="c">#</span> | 
|  | 201 <a name="GetVertices-"></a> 188 <span class="k">sub </span><span class="m">GetVertices</span> <span class="s">{</span> | 
|  | 202  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> | 
|  | 203  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> | 
|  | 204  191 | 
|  | 205  192   <span class="i">@VertexValues</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 206  193   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 207  194     <span class="i">@VertexValues</span> = <span class="k">map</span> <span class="s">{</span> <span class="i">$This</span><span class="i">->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> | 
|  | 208  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> | 
|  | 209  196   <span class="s">}</span> | 
|  | 210  197   <span class="k">else</span> <span class="s">{</span> | 
|  | 211  198     <span class="i">@VertexValues</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> <=> <span class="i">$b</span> <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Vertices</span>}}<span class="sc">;</span> | 
|  | 212  199     <span class="i">$ValuesCount</span> = <span class="i">@VertexValues</span><span class="sc">;</span> | 
|  | 213  200   <span class="s">}</span> | 
|  | 214  201 | 
|  | 215  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> | 
|  | 216  203 <span class="s">}</span> | 
|  | 217  204 | 
|  | 218  205 <span class="c"># Is this vertex present?</span> | 
|  | 219 <a name="HasVertex-"></a> 206 <span class="k">sub </span><span class="m">HasVertex</span> <span class="s">{</span> | 
|  | 220  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> | 
|  | 221  208 | 
|  | 222  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> | 
|  | 223  210     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 224  211   <span class="s">}</span> | 
|  | 225  212   <span class="k">return</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Vertices</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> | 
|  | 226  213 <span class="s">}</span> | 
|  | 227  214 | 
|  | 228  215 <span class="c"># Are these vertices present? Return an array containing 1 or 0  for each vertex.</span> | 
|  | 229  216 <span class="c"># In scalar context, return number of vertices found.</span> | 
|  | 230 <a name="HasVertices-"></a> 217 <span class="k">sub </span><span class="m">HasVertices</span> <span class="s">{</span> | 
|  | 231  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> | 
|  | 232  219 | 
|  | 233  220   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 234  221     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 235  222   <span class="s">}</span> | 
|  | 236  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> | 
|  | 237  224 | 
|  | 238  225   <span class="i">@VerticesStatus</span> = <span class="k">map</span> <span class="s">{</span> <span class="i">$This</span><span class="i">->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> | 
|  | 239  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> | 
|  | 240  227 | 
|  | 241  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> | 
|  | 242  229 <span class="s">}</span> | 
|  | 243  230 | 
|  | 244  231 <span class="c"># Add an edge...</span> | 
|  | 245 <a name="AddEdge-"></a> 232 <span class="k">sub </span><span class="m">AddEdge</span> <span class="s">{</span> | 
|  | 246  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> | 
|  | 247  234 | 
|  | 248  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> && <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> | 
|  | 249  236     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddEdge: No edge added: Both vertices must be defined..."</span><span class="sc">;</span> | 
|  | 250  237     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 251  238   <span class="s">}</span> | 
|  | 252  239   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertex</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 253  240     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddEdge: Didn't add edge between vertices $VertexID1 and $VertexID2: Vertex $VertexID1 doesn's exist..."</span><span class="sc">;</span> | 
|  | 254  241     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 255  242   <span class="s">}</span> | 
|  | 256  243   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertex</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 257  244     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddEdge: Didn't add edge between vertices $VertexID1 and $VertexID2: Vertex $VertexID2 doesn's exist..."</span><span class="sc">;</span> | 
|  | 258  245     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 259  246   <span class="s">}</span> | 
|  | 260  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> | 
|  | 261  248     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddEdge: Didn't add edge between vertices $VertexID1 and $VertexID2: Vertices must be different..."</span><span class="sc">;</span> | 
|  | 262  249     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 263  250   <span class="s">}</span> | 
|  | 264  251   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->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> | 
|  | 265  252     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddEdge: Didn't add edge between vertices $VertexID1 and $VertexID2: Edge already exists..."</span><span class="sc">;</span> | 
|  | 266  253     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 267  254   <span class="s">}</span> | 
|  | 268  255 | 
|  | 269  256   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 270  257     <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID1</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 271  258   <span class="s">}</span> | 
|  | 272  259   <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>} = <span class="i">$VertexID2</span><span class="sc">;</span> | 
|  | 273  260 | 
|  | 274  261   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 275  262     <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID2</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 276  263   <span class="s">}</span> | 
|  | 277  264   <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID2</span>}->{<span class="i">$VertexID1</span>} = <span class="i">$VertexID1</span><span class="sc">;</span> | 
|  | 278  265 | 
|  | 279  266   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 280  267 <span class="s">}</span> | 
|  | 281  268 | 
|  | 282  269 <span class="c"># Add edges...</span> | 
|  | 283 <a name="AddEdges-"></a> 270 <span class="k">sub </span><span class="m">AddEdges</span> <span class="s">{</span> | 
|  | 284  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> | 
|  | 285  272 | 
|  | 286  273   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 287  274     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddEdges: No edges added: Vertices list is empty..."</span><span class="sc">;</span> | 
|  | 288  275     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 289  276   <span class="s">}</span> | 
|  | 290  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> | 
|  | 291  278     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddEdges: No edges added: Invalid vertices data: Input list must contain even number of vertex IDs..."</span><span class="sc">;</span> | 
|  | 292  279     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 293  280   <span class="s">}</span> | 
|  | 294  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> | 
|  | 295  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> < <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> | 
|  | 296  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> | 
|  | 297  284     <span class="i">$This</span><span class="i">->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> | 
|  | 298  285   <span class="s">}</span> | 
|  | 299  286 | 
|  | 300  287   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 301  288 <span class="s">}</span> | 
|  | 302  289 | 
|  | 303  290 <span class="c"># Delete an edge...</span> | 
|  | 304 <a name="DeleteEdge-"></a> 291 <span class="k">sub </span><span class="m">DeleteEdge</span> <span class="s">{</span> | 
|  | 305  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> | 
|  | 306  293 | 
|  | 307  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> && <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> | 
|  | 308  295     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->Delete: No edge deleted: Both vertices must be defined..."</span><span class="sc">;</span> | 
|  | 309  296     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 310  297   <span class="s">}</span> | 
|  | 311  298   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertex</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 312  299     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteEdge: Didn't delete edge between vertices $VertexID1 and $VertexID2: Vertex $VertexID1 doesn's exist..."</span><span class="sc">;</span> | 
|  | 313  300     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 314  301   <span class="s">}</span> | 
|  | 315  302   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertex</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 316  303     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteEdge: Didn't delete edge between vertices $VertexID1 and $VertexID2: Vertex $VertexID2 doesn's exist..."</span><span class="sc">;</span> | 
|  | 317  304     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 318  305   <span class="s">}</span> | 
|  | 319  306   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->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> | 
|  | 320  307     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteEdge: Didn't delete edge between vertices $VertexID1 and $VertexID2: Edge doesn't exist..."</span><span class="sc">;</span> | 
|  | 321  308     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 322  309   <span class="s">}</span> | 
|  | 323  310   <span class="i">$This</span><span class="i">->_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> | 
|  | 324  311   <span class="i">$This</span><span class="i">->_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> | 
|  | 325  312 <span class="s">}</span> | 
|  | 326  313 | 
|  | 327  314 <span class="c"># Delete edge...</span> | 
|  | 328 <a name="_DeleteEdge-"></a> 315 <span class="k">sub </span><span class="m">_DeleteEdge</span> <span class="s">{</span> | 
|  | 329  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> | 
|  | 330  317 | 
|  | 331  318   <span class="c"># Delete the edge...</span> | 
|  | 332  319   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 333  320     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 334  321       <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}<span class="sc">;</span> | 
|  | 335  322     <span class="s">}</span> | 
|  | 336  323     <span class="k">if</span> <span class="s">(</span>! <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID1</span>}}<span class="s">)</span> <span class="s">{</span> | 
|  | 337  324       <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID1</span>}<span class="sc">;</span> | 
|  | 338  325     <span class="s">}</span> | 
|  | 339  326   <span class="s">}</span> | 
|  | 340  327 | 
|  | 341  328   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 342  329     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID2</span>}->{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 343  330       <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID2</span>}->{<span class="i">$VertexID1</span>}<span class="sc">;</span> | 
|  | 344  331     <span class="s">}</span> | 
|  | 345  332     <span class="k">if</span> <span class="s">(</span>! <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID2</span>}}<span class="s">)</span> <span class="s">{</span> | 
|  | 346  333       <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID2</span>}<span class="sc">;</span> | 
|  | 347  334     <span class="s">}</span> | 
|  | 348  335   <span class="s">}</span> | 
|  | 349  336 | 
|  | 350  337   <span class="c"># Delete properties associated with the edge...</span> | 
|  | 351  338   <span class="i">$This</span><span class="i">->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> | 
|  | 352  339 <span class="s">}</span> | 
|  | 353  340 | 
|  | 354  341 <span class="c"># Delete edges...</span> | 
|  | 355 <a name="DeleteEdges-"></a> 342 <span class="k">sub </span><span class="m">DeleteEdges</span> <span class="s">{</span> | 
|  | 356  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> | 
|  | 357  344 | 
|  | 358  345   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 359  346     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteEdges: No edges deleted: Vertices list is empty..."</span><span class="sc">;</span> | 
|  | 360  347     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 361  348   <span class="s">}</span> | 
|  | 362  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> | 
|  | 363  350     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteEdges: No edges deleted: Invalid vertices data: Input list must contain even number of vertex IDs..."</span><span class="sc">;</span> | 
|  | 364  351     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 365  352   <span class="s">}</span> | 
|  | 366  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> | 
|  | 367  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> < <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> | 
|  | 368  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> | 
|  | 369  356     <span class="i">$This</span><span class="i">->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> | 
|  | 370  357   <span class="s">}</span> | 
|  | 371  358 | 
|  | 372  359   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 373  360 <span class="s">}</span> | 
|  | 374  361 | 
|  | 375  362 <span class="c"># Does the edge defiend by a vertex pair exists? Edges defined from VertexID1 to VertecID2</span> | 
|  | 376  363 <span class="c"># and VertexID2 to VertexID1 are considered equivalent...</span> | 
|  | 377 <a name="HasEdge-"></a> 364 <span class="k">sub </span><span class="m">HasEdge</span> <span class="s">{</span> | 
|  | 378  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> | 
|  | 379  366 | 
|  | 380  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> && <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> | 
|  | 381  368     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 382  369   <span class="s">}</span> | 
|  | 383  370 | 
|  | 384  371   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->_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">->_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> | 
|  | 385  372 <span class="s">}</span> | 
|  | 386  373 | 
|  | 387  374 <span class="c"># Does edge exists?</span> | 
|  | 388 <a name="_HasEdge-"></a> 375 <span class="k">sub </span><span class="m">_HasEdge</span> <span class="s">{</span> | 
|  | 389  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> | 
|  | 390  377 | 
|  | 391  378   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 392  379     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 393  380       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 394  381     <span class="s">}</span> | 
|  | 395  382   <span class="s">}</span> | 
|  | 396  383   <span class="k">elsif</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 397  384     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID2</span>}->{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 398  385       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 399  386     <span class="s">}</span> | 
|  | 400  387   <span class="s">}</span> | 
|  | 401  388   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 402  389 <span class="s">}</span> | 
|  | 403  390 | 
|  | 404  391 <span class="c"># Do the edges defiend by vertex pairs exist? In scalar context, return the number</span> | 
|  | 405  392 <span class="c"># of edges found...</span> | 
|  | 406 <a name="HasEdges-"></a> 393 <span class="k">sub </span><span class="m">HasEdges</span> <span class="s">{</span> | 
|  | 407  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> | 
|  | 408  395 | 
|  | 409  396   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 410  397     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 411  398   <span class="s">}</span> | 
|  | 412  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> | 
|  | 413  400     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 414  401   <span class="s">}</span> | 
|  | 415  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> | 
|  | 416  403   <span class="i">@EdgesStatus</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 417  404   <span class="i">$EdgesCount</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 418  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> < <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> | 
|  | 419  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> | 
|  | 420  407     <span class="i">$Status</span> = <span class="i">$This</span><span class="i">->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> | 
|  | 421  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> | 
|  | 422  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> && <span class="i">$Status</span><span class="s">)</span> <span class="s">{</span> | 
|  | 423  410       <span class="i">$EdgesCount</span>++<span class="sc">;</span> | 
|  | 424  411     <span class="s">}</span> | 
|  | 425  412   <span class="s">}</span> | 
|  | 426  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> | 
|  | 427  414 <span class="s">}</span> | 
|  | 428  415 | 
|  | 429  416 <span class="c"># Get edges for a vertex ID or retrieve all the edges. In scalar context,</span> | 
|  | 430  417 <span class="c">#  return the number of edges.</span> | 
|  | 431  418 <span class="c">#</span> | 
|  | 432 <a name="GetEdges-"></a> 419 <span class="k">sub </span><span class="m">GetEdges</span> <span class="s">{</span> | 
|  | 433  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> | 
|  | 434  421   <span class="k">my</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 435  422 | 
|  | 436  423   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 437  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> | 
|  | 438  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">->_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">->_GetEdgesTo</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> | 
|  | 439  426   <span class="s">}</span> | 
|  | 440  427   <span class="k">else</span> <span class="s">{</span> | 
|  | 441  428     <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">$This</span><span class="i">->_GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 442  429   <span class="s">}</span> | 
|  | 443  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> | 
|  | 444  431 <span class="s">}</span> | 
|  | 445  432 | 
|  | 446  433 <span class="c"># Get edge starting from the vertex to its successor vertices...</span> | 
|  | 447 <a name="_GetEdgesFrom-"></a> 434 <span class="k">sub </span><span class="m">_GetEdgesFrom</span> <span class="s">{</span> | 
|  | 448  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> | 
|  | 449  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> | 
|  | 450  437 | 
|  | 451  438   <span class="k">return</span> <span class="i">$This</span><span class="i">->_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> | 
|  | 452  439 <span class="s">}</span> | 
|  | 453  440 | 
|  | 454  441 <span class="c"># Get edge starting from predecessors to the vertex...</span> | 
|  | 455 <a name="_GetEdgesTo-"></a> 442 <span class="k">sub </span><span class="m">_GetEdgesTo</span> <span class="s">{</span> | 
|  | 456  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> | 
|  | 457  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> | 
|  | 458  445 | 
|  | 459  446   <span class="k">return</span> <span class="i">$This</span><span class="i">->_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> | 
|  | 460  447 <span class="s">}</span> | 
|  | 461  448 | 
|  | 462  449 <span class="c"># Get edges as pair of vertex IDs. Edges data can be retrieved in three</span> | 
|  | 463  450 <span class="c"># different ways:</span> | 
|  | 464  451 <span class="c">#</span> | 
|  | 465  452 <span class="c"># Both vertex IDs are defined: Returns existing edge between the vertices</span> | 
|  | 466  453 <span class="c"># Only first vertex ID defined: Returns all edges at the vertex</span> | 
|  | 467  454 <span class="c"># Only second vertex defined: Returns all edges at the vertex</span> | 
|  | 468  455 <span class="c"># No vertex IDs defined: Returns all edges</span> | 
|  | 469  456 <span class="c">#</span> | 
|  | 470 <a name="_GetEdges-"></a> 457 <span class="k">sub </span><span class="m">_GetEdges</span> <span class="s">{</span> | 
|  | 471  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> | 
|  | 472  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> | 
|  | 473  460 | 
|  | 474  461   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 475  462 | 
|  | 476  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> && <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> | 
|  | 477  464     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->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> | 
|  | 478  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> | 
|  | 479  466     <span class="s">}</span> | 
|  | 480  467   <span class="s">}</span> | 
|  | 481  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> | 
|  | 482  469     <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">$This</span><span class="i">->_GetNeighborsFrom</span><span class="s">(</span><span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 483  470       <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">$This</span><span class="i">->_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> | 
|  | 484  471     <span class="s">}</span> | 
|  | 485  472   <span class="s">}</span> | 
|  | 486  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> | 
|  | 487  474     <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">$This</span><span class="i">->_GetNeighborsTo</span><span class="s">(</span><span class="i">$VertexID2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 488  475       <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">$This</span><span class="i">->_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> | 
|  | 489  476     <span class="s">}</span> | 
|  | 490  477   <span class="s">}</span> | 
|  | 491  478   <span class="k">else</span> <span class="s">{</span> | 
|  | 492  479     <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 493  480       <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">$This</span><span class="i">->_GetEdges</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 494  481     <span class="s">}</span> | 
|  | 495  482   <span class="s">}</span> | 
|  | 496  483 | 
|  | 497  484   <span class="k">return</span> <span class="i">@VertexIDs</span><span class="sc">;</span> | 
|  | 498  485 <span class="s">}</span> | 
|  | 499  486 | 
|  | 500  487 <span class="c"># Add edges between successive pair of vertex IDs......</span> | 
|  | 501 <a name="AddPath-"></a> 488 <span class="k">sub </span><span class="m">AddPath</span> <span class="s">{</span> | 
|  | 502  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> | 
|  | 503  490 | 
|  | 504  491   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 505  492     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddPath: No path added: Vertices list is empty..."</span><span class="sc">;</span> | 
|  | 506  493     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 507  494   <span class="s">}</span> | 
|  | 508  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> | 
|  | 509  496     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddPath: No path added: Invalid vertices data: Input list must contain more than on vertex ID..."</span><span class="sc">;</span> | 
|  | 510  497     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 511  498   <span class="s">}</span> | 
|  | 512  499   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 513  500     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddPath: No path added: Some of the vertex IDs don't exist in the graph..."</span><span class="sc">;</span> | 
|  | 514  501     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 515  502   <span class="s">}</span> | 
|  | 516  503   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasPath</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 517  504     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddPath: No path added: Path already exist in the graph..."</span><span class="sc">;</span> | 
|  | 518  505     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 519  506   <span class="s">}</span> | 
|  | 520  507   <span class="k">my</span><span class="s">(</span><span class="i">@PathVertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 521  508   <span class="i">@PathVertexIDs</span> =<span class="i">$This</span><span class="i">-> _SetupPathVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 522  509 | 
|  | 523  510   <span class="k">return</span> <span class="i">$This</span><span class="i">->AddEdges</span><span class="s">(</span><span class="i">@PathVertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 524  511 <span class="s">}</span> | 
|  | 525  512 | 
|  | 526  513 | 
|  | 527  514 <span class="c"># Delete edges between successive pair of vertex IDs......</span> | 
|  | 528 <a name="DeletePath-"></a> 515 <span class="k">sub </span><span class="m">DeletePath</span> <span class="s">{</span> | 
|  | 529  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> | 
|  | 530  517 | 
|  | 531  518   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 532  519     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeletePath: No path deleted: Vertices list is empty..."</span><span class="sc">;</span> | 
|  | 533  520     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 534  521   <span class="s">}</span> | 
|  | 535  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> | 
|  | 536  523     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeletePath: No path deleted: Invalid vertices data: Input list must contain more than on vertex ID..."</span><span class="sc">;</span> | 
|  | 537  524     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 538  525   <span class="s">}</span> | 
|  | 539  526   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 540  527     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeletePath: No path deleted: Some of the vertex IDs don't exist in the graph..."</span><span class="sc">;</span> | 
|  | 541  528     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 542  529   <span class="s">}</span> | 
|  | 543  530   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasPath</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 544  531     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeletePath: No path deleted: Path doesn't exist in the graph..."</span><span class="sc">;</span> | 
|  | 545  532     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 546  533   <span class="s">}</span> | 
|  | 547  534   <span class="k">my</span><span class="s">(</span><span class="i">@PathVertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 548  535   <span class="i">@PathVertexIDs</span> = <span class="i">$This</span><span class="i">->_SetupPathVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 549  536 | 
|  | 550  537   <span class="k">return</span> <span class="i">$This</span><span class="i">->DeleteEdges</span><span class="s">(</span><span class="i">@PathVertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 551  538 <span class="s">}</span> | 
|  | 552  539 | 
|  | 553  540 <span class="c"># Does the path defiend by edges between successive pairs of vertex IDs exist?</span> | 
|  | 554 <a name="HasPath-"></a> 541 <span class="k">sub </span><span class="m">HasPath</span> <span class="s">{</span> | 
|  | 555  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> | 
|  | 556  543 | 
|  | 557  544   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 558  545     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 559  546   <span class="s">}</span> | 
|  | 560  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> | 
|  | 561  548     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 562  549   <span class="s">}</span> | 
|  | 563  550   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 564  551     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 565  552   <span class="s">}</span> | 
|  | 566  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> | 
|  | 567  554   <span class="i">@PathVertexIDs</span> = <span class="i">$This</span><span class="i">->_SetupPathVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 568  555   <span class="i">$Status</span> = <span class="s">(</span><span class="i">$This</span><span class="i">->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> | 
|  | 569  556 | 
|  | 570  557   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span> | 
|  | 571  558 <span class="s">}</span> | 
|  | 572  559 | 
|  | 573  560 <span class="c"># Setup vertices for the path to define edges between successive pair of vertex IDs...</span> | 
|  | 574 <a name="_SetupPathVertices-"></a> 561 <span class="k">sub </span><span class="m">_SetupPathVertices</span> <span class="s">{</span> | 
|  | 575  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> | 
|  | 576  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> | 
|  | 577  564 | 
|  | 578  565   <span class="i">@PathVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 579  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> | 
|  | 580  567     <span class="i">$VertexID1</span> = <span class="i">$VertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 581  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> | 
|  | 582  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> | 
|  | 583  570   <span class="s">}</span> | 
|  | 584  571 | 
|  | 585  572   <span class="k">return</span> <span class="i">@PathVertexIDs</span><span class="sc">;</span> | 
|  | 586  573 <span class="s">}</span> | 
|  | 587  574 | 
|  | 588  575 <span class="c"># Add edges between successive pair of vertex IDs and an additional edge from the last to</span> | 
|  | 589  576 <span class="c"># the first ID to complete the cycle......</span> | 
|  | 590 <a name="AddCycle-"></a> 577 <span class="k">sub </span><span class="m">AddCycle</span> <span class="s">{</span> | 
|  | 591  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> | 
|  | 592  579 | 
|  | 593  580   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 594  581     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddCycle: No cycle added: Vertices list is empty..."</span><span class="sc">;</span> | 
|  | 595  582     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 596  583   <span class="s">}</span> | 
|  | 597  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> | 
|  | 598  585     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddCycle: No cycle added: Invalid vertices data: Input list must contain more than on vertex ID..."</span><span class="sc">;</span> | 
|  | 599  586     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 600  587   <span class="s">}</span> | 
|  | 601  588   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 602  589     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddCycle: No cycle added: Some of the vertex IDs don't exist in the graph..."</span><span class="sc">;</span> | 
|  | 603  590     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 604  591   <span class="s">}</span> | 
|  | 605  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> | 
|  | 606  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> | 
|  | 607  594 | 
|  | 608  595   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasCycle</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 609  596     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddCycle: No cycle added: Cycle already exist in the graph..."</span><span class="sc">;</span> | 
|  | 610  597     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 611  598   <span class="s">}</span> | 
|  | 612  599 | 
|  | 613  600   <span class="k">return</span> <span class="i">$This</span><span class="i">->AddPath</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 614  601 <span class="s">}</span> | 
|  | 615  602 | 
|  | 616  603 <span class="c"># Delete edges between successive pair of vertex IDs and an additional edge from the last to</span> | 
|  | 617  604 <span class="c"># the first ID to complete the cycle......</span> | 
|  | 618 <a name="DeleteCycle-"></a> 605 <span class="k">sub </span><span class="m">DeleteCycle</span> <span class="s">{</span> | 
|  | 619  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> | 
|  | 620  607 | 
|  | 621  608   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 622  609     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteCycle: No cycle deleted: Vertices list is empty..."</span><span class="sc">;</span> | 
|  | 623  610     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 624  611   <span class="s">}</span> | 
|  | 625  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> | 
|  | 626  613     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteCycle: No cycle deleted: Invalid vertices data: Input list must contain more than on vertex ID..."</span><span class="sc">;</span> | 
|  | 627  614     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 628  615   <span class="s">}</span> | 
|  | 629  616   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 630  617     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteCycle: No cycle deleted: Some of the vertex IDs don't exist in the graph..."</span><span class="sc">;</span> | 
|  | 631  618     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 632  619   <span class="s">}</span> | 
|  | 633  620   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasCycle</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 634  621     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteCycle: No cycle deleted: Cycle doesn't exist in the graph..."</span><span class="sc">;</span> | 
|  | 635  622     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 636  623   <span class="s">}</span> | 
|  | 637  624 | 
|  | 638  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> | 
|  | 639  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> | 
|  | 640  627 | 
|  | 641  628   <span class="k">return</span> <span class="i">$This</span><span class="i">->DeletePath</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 642  629 <span class="s">}</span> | 
|  | 643  630 | 
|  | 644  631 <span class="c"># Does the cycle defiend by edges between successive pairs of vertex IDs along with an additional</span> | 
|  | 645  632 <span class="c"># edge from last to first vertex ID exist?</span> | 
|  | 646 <a name="HasCycle-"></a> 633 <span class="k">sub </span><span class="m">HasCycle</span> <span class="s">{</span> | 
|  | 647  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> | 
|  | 648  635 | 
|  | 649  636   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 650  637     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 651  638   <span class="s">}</span> | 
|  | 652  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> | 
|  | 653  640     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 654  641   <span class="s">}</span> | 
|  | 655  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> | 
|  | 656  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> | 
|  | 657  644 | 
|  | 658  645   <span class="k">return</span> <span class="i">$This</span><span class="i">->HasPath</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 659  646 <span class="s">}</span> | 
|  | 660  647 | 
|  | 661  648 <span class="c"># Get neighbors...</span> | 
|  | 662 <a name="GetNeighbors-"></a> 649 <span class="k">sub </span><span class="m">GetNeighbors</span> <span class="s">{</span> | 
|  | 663  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> | 
|  | 664  651 | 
|  | 665  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> | 
|  | 666  653     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 667  654   <span class="s">}</span> | 
|  | 668  655   <span class="k">if</span> <span class="s">(</span>! <span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 669  656     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 670  657   <span class="s">}</span> | 
|  | 671  658 | 
|  | 672  659   <span class="c"># Get a list of unsorted vertices and sort 'em once before returning...</span> | 
|  | 673  660   <span class="c">#</span> | 
|  | 674  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> | 
|  | 675  662 | 
|  | 676  663   <span class="i">$SortVertices</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 677  664   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 678  665 | 
|  | 679  666   <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">$This</span><span class="i">->_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> | 
|  | 680  667   <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">$This</span><span class="i">->_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> | 
|  | 681  668   <span class="i">$VerticesCount</span> = <span class="i">@VertexIDs</span><span class="sc">;</span> | 
|  | 682  669 | 
|  | 683  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> <=> <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> | 
|  | 684  671 <span class="s">}</span> | 
|  | 685  672 | 
|  | 686  673 <span class="c"># Get neighbors added by defining edges from the vertex. For undirected graph, it has no</span> | 
|  | 687  674 <span class="c"># strict meaning...</span> | 
|  | 688 <a name="_GetNeighborsFrom-"></a> 675 <span class="k">sub </span><span class="m">_GetNeighborsFrom</span> <span class="s">{</span> | 
|  | 689  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> | 
|  | 690  677   <span class="k">my</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 691  678 | 
|  | 692  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> | 
|  | 693  680   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 694  681 | 
|  | 695  682   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 696  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>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID</span>}->{<span class="i">$_</span>} <span class="s">}</span>  <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID</span>}}<span class="sc">;</span> | 
|  | 697  684   <span class="s">}</span> | 
|  | 698  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> <=> <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> | 
|  | 699  686 <span class="s">}</span> | 
|  | 700  687 | 
|  | 701  688 <span class="c"># Get neighbors added by defining edges to the vertex. For undirected graphs, it has no</span> | 
|  | 702  689 <span class="c"># strict meaning.</span> | 
|  | 703 <a name="_GetNeighborsTo-"></a> 690 <span class="k">sub </span><span class="m">_GetNeighborsTo</span> <span class="s">{</span> | 
|  | 704  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> | 
|  | 705  692   <span class="k">my</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> | 
|  | 706  693 | 
|  | 707  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> | 
|  | 708  695   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 709  696 | 
|  | 710  697   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 711  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>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID</span>}->{<span class="i">$_</span>} <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID</span>}}<span class="sc">;</span> | 
|  | 712  699   <span class="s">}</span> | 
|  | 713  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> <=> <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> | 
|  | 714  701 <span class="s">}</span> | 
|  | 715  702 | 
|  | 716  703 <span class="c"># Get vertex degree...</span> | 
|  | 717  704 <span class="c">#</span> | 
|  | 718 <a name="GetDegree-"></a> 705 <span class="k">sub </span><span class="m">GetDegree</span> <span class="s">{</span> | 
|  | 719  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> | 
|  | 720  707 | 
|  | 721  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> | 
|  | 722  709     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 723  710   <span class="s">}</span> | 
|  | 724  711   <span class="k">if</span> <span class="s">(</span>! <span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 725  712     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 726  713   <span class="s">}</span> | 
|  | 727  714   <span class="k">my</span><span class="s">(</span><span class="i">$Degree</span><span class="s">)</span><span class="sc">;</span> | 
|  | 728  715   <span class="i">$Degree</span> = <span class="i">$This</span><span class="i">->_GetInDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span> + <span class="i">$This</span><span class="i">->_GetOutDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 729  716 | 
|  | 730  717   <span class="k">return</span> <span class="i">$Degree</span><span class="sc">;</span> | 
|  | 731  718 <span class="s">}</span> | 
|  | 732  719 | 
|  | 733  720 <span class="c"># Get in degree added by defining edges to the vertex. For undirected graphs, it has no</span> | 
|  | 734  721 <span class="c"># strict meaning.</span> | 
|  | 735  722 <span class="c">#</span> | 
|  | 736 <a name="_GetInDegree-"></a> 723 <span class="k">sub </span><span class="m">_GetInDegree</span> <span class="s">{</span> | 
|  | 737  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> | 
|  | 738  725   <span class="k">my</span><span class="s">(</span><span class="i">$Degree</span><span class="s">)</span><span class="sc">;</span> | 
|  | 739  726 | 
|  | 740  727   <span class="i">$Degree</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 741  728   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 742  729     <span class="i">$Degree</span> = <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">To</span>}->{<span class="i">$VertexID</span>}}<span class="sc">;</span> | 
|  | 743  730   <span class="s">}</span> | 
|  | 744  731   <span class="k">return</span> <span class="i">$Degree</span><span class="sc">;</span> | 
|  | 745  732 <span class="s">}</span> | 
|  | 746  733 | 
|  | 747  734 <span class="c"># Get out degree added by defining edges from the vertex. For undirected graphs, it has no</span> | 
|  | 748  735 <span class="c"># strict meaning.</span> | 
|  | 749  736 <span class="c">#</span> | 
|  | 750 <a name="_GetOutDegree-"></a> 737 <span class="k">sub </span><span class="m">_GetOutDegree</span> <span class="s">{</span> | 
|  | 751  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> | 
|  | 752  739   <span class="k">my</span><span class="s">(</span><span class="i">$Degree</span><span class="s">)</span><span class="sc">;</span> | 
|  | 753  740 | 
|  | 754  741   <span class="i">$Degree</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 755  742   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 756  743     <span class="i">$Degree</span> = <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Edges</span>}->{<span class="w">From</span>}->{<span class="i">$VertexID</span>}}<span class="sc">;</span> | 
|  | 757  744   <span class="s">}</span> | 
|  | 758  745   <span class="k">return</span> <span class="i">$Degree</span><span class="sc">;</span> | 
|  | 759  746 <span class="s">}</span> | 
|  | 760  747 | 
|  | 761  748 <span class="c"># Get vertex with smallest degree...</span> | 
|  | 762  749 <span class="c">#</span> | 
|  | 763 <a name="GetVertexWithSmallestDegree-"></a> 750 <span class="k">sub </span><span class="m">GetVertexWithSmallestDegree</span> <span class="s">{</span> | 
|  | 764  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> | 
|  | 765  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> | 
|  | 766  753 | 
|  | 767  754   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 768  755   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 769  756   <span class="k">if</span> <span class="s">(</span>! <span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 770  757     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 771  758   <span class="s">}</span> | 
|  | 772  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> | 
|  | 773  760 | 
|  | 774  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> | 
|  | 775  762     <span class="i">$Degree</span> = <span class="i">$This</span><span class="i">->_GetInDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span> + <span class="i">$This</span><span class="i">->_GetOutDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 776  763     <span class="k">if</span> <span class="s">(</span><span class="i">$Degree</span> < <span class="i">$SmallestDegree</span><span class="s">)</span> <span class="s">{</span> | 
|  | 777  764       <span class="i">$SmallestDegree</span> = <span class="i">$Degree</span><span class="sc">;</span> | 
|  | 778  765       <span class="i">$SmallestDegreeVertexID</span> = <span class="i">$VertexID</span><span class="sc">;</span> | 
|  | 779  766     <span class="s">}</span> | 
|  | 780  767   <span class="s">}</span> | 
|  | 781  768   <span class="k">return</span> <span class="i">$SmallestDegreeVertexID</span><span class="sc">;</span> | 
|  | 782  769 <span class="s">}</span> | 
|  | 783  770 | 
|  | 784  771 <span class="c"># Get vertex with largest degree...</span> | 
|  | 785  772 <span class="c">#</span> | 
|  | 786 <a name="GetVertexWithLargestDegree-"></a> 773 <span class="k">sub </span><span class="m">GetVertexWithLargestDegree</span> <span class="s">{</span> | 
|  | 787  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> | 
|  | 788  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> | 
|  | 789  776 | 
|  | 790  777   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 791  778   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 792  779   <span class="k">if</span> <span class="s">(</span>! <span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 793  780     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 794  781   <span class="s">}</span> | 
|  | 795  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> | 
|  | 796  783 | 
|  | 797  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> | 
|  | 798  785     <span class="i">$Degree</span> = <span class="i">$This</span><span class="i">->_GetInDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span> + <span class="i">$This</span><span class="i">->_GetOutDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 799  786     <span class="k">if</span> <span class="s">(</span><span class="i">$Degree</span> > <span class="i">$LargestDegree</span><span class="s">)</span> <span class="s">{</span> | 
|  | 800  787       <span class="i">$LargestDegree</span> = <span class="i">$Degree</span><span class="sc">;</span> | 
|  | 801  788       <span class="i">$LargestDegreeVertexID</span> = <span class="i">$VertexID</span><span class="sc">;</span> | 
|  | 802  789     <span class="s">}</span> | 
|  | 803  790   <span class="s">}</span> | 
|  | 804  791   <span class="k">return</span> <span class="i">$LargestDegreeVertexID</span><span class="sc">;</span> | 
|  | 805  792 <span class="s">}</span> | 
|  | 806  793 | 
|  | 807  794 <span class="c"># Get maximum degree in the graph...</span> | 
|  | 808  795 <span class="c">#</span> | 
|  | 809 <a name="GetMaximumDegree-"></a> 796 <span class="k">sub </span><span class="m">GetMaximumDegree</span> <span class="s">{</span> | 
|  | 810  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> | 
|  | 811  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> | 
|  | 812  799 | 
|  | 813  800   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 814  801   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 815  802   <span class="k">if</span> <span class="s">(</span>! <span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 816  803     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 817  804   <span class="s">}</span> | 
|  | 818  805   <span class="i">$MaximumDegree</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 819  806 | 
|  | 820  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> | 
|  | 821  808     <span class="i">$Degree</span> = <span class="i">$This</span><span class="i">->GetDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 822  809     <span class="k">if</span> <span class="s">(</span><span class="i">$Degree</span> > <span class="i">$MaximumDegree</span><span class="s">)</span> <span class="s">{</span> | 
|  | 823  810       <span class="i">$MaximumDegree</span> = <span class="i">$Degree</span><span class="sc">;</span> | 
|  | 824  811     <span class="s">}</span> | 
|  | 825  812   <span class="s">}</span> | 
|  | 826  813   <span class="k">return</span> <span class="i">$MaximumDegree</span><span class="sc">;</span> | 
|  | 827  814 <span class="s">}</span> | 
|  | 828  815 | 
|  | 829  816 <span class="c"># Get minimum degree in the graph...</span> | 
|  | 830  817 <span class="c">#</span> | 
|  | 831 <a name="GetMininumDegree-"></a> 818 <span class="k">sub </span><span class="m">GetMininumDegree</span> <span class="s">{</span> | 
|  | 832  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> | 
|  | 833  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> | 
|  | 834  821 | 
|  | 835  822   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 836  823   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 837  824   <span class="k">if</span> <span class="s">(</span>! <span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 838  825     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 839  826   <span class="s">}</span> | 
|  | 840  827   <span class="i">$MininumDegree</span> = <span class="n">99999</span><span class="sc">;</span> | 
|  | 841  828 | 
|  | 842  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> | 
|  | 843  830     <span class="i">$Degree</span> = <span class="i">$This</span><span class="i">->GetDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 844  831     <span class="k">if</span> <span class="s">(</span><span class="i">$Degree</span> < <span class="i">$MininumDegree</span><span class="s">)</span> <span class="s">{</span> | 
|  | 845  832       <span class="i">$MininumDegree</span> = <span class="i">$Degree</span><span class="sc">;</span> | 
|  | 846  833     <span class="s">}</span> | 
|  | 847  834   <span class="s">}</span> | 
|  | 848  835   <span class="k">return</span> <span class="i">$MininumDegree</span><span class="sc">;</span> | 
|  | 849  836 <span class="s">}</span> | 
|  | 850  837 | 
|  | 851  838 <span class="c"># Is it a isolated vertex?</span> | 
|  | 852  839 <span class="c">#</span> | 
|  | 853 <a name="IsIsolatedVertex-"></a> 840 <span class="k">sub </span><span class="m">IsIsolatedVertex</span> <span class="s">{</span> | 
|  | 854  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> | 
|  | 855  842 | 
|  | 856  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> | 
|  | 857  844     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 858  845   <span class="s">}</span> | 
|  | 859  846   <span class="k">if</span> <span class="s">(</span>! <span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 860  847     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 861  848   <span class="s">}</span> | 
|  | 862  849   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->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> | 
|  | 863  850 <span class="s">}</span> | 
|  | 864  851 | 
|  | 865  852 <span class="c"># Get all isolated vertices...</span> | 
|  | 866  853 <span class="c">#</span> | 
|  | 867 <a name="GetIsolatedVertices-"></a> 854 <span class="k">sub </span><span class="m">GetIsolatedVertices</span> <span class="s">{</span> | 
|  | 868  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> | 
|  | 869  856 | 
|  | 870  857   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetVerticesWithDegreeLessThan</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 871  858 <span class="s">}</span> | 
|  | 872  859 | 
|  | 873  860 <span class="c"># Is it a leaf vertex?</span> | 
|  | 874  861 <span class="c">#</span> | 
|  | 875 <a name="IsLeafVertex-"></a> 862 <span class="k">sub </span><span class="m">IsLeafVertex</span> <span class="s">{</span> | 
|  | 876  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> | 
|  | 877  864 | 
|  | 878  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> | 
|  | 879  866     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 880  867   <span class="s">}</span> | 
|  | 881  868   <span class="k">if</span> <span class="s">(</span>! <span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 882  869     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 883  870   <span class="s">}</span> | 
|  | 884  871   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->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> | 
|  | 885  872 <span class="s">}</span> | 
|  | 886  873 | 
|  | 887  874 <span class="c"># Get all leaf vertices...</span> | 
|  | 888  875 <span class="c">#</span> | 
|  | 889 <a name="GetLeafVertices-"></a> 876 <span class="k">sub </span><span class="m">GetLeafVertices</span> <span class="s">{</span> | 
|  | 890  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> | 
|  | 891  878 | 
|  | 892  879   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetVerticesWithDegreeLessThan</span><span class="s">(</span><span class="n">2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 893  880 <span class="s">}</span> | 
|  | 894  881 | 
|  | 895  882 <span class="c"># Get vertices  with degree less than a specified value...</span> | 
|  | 896  883 <span class="c">#</span> | 
|  | 897 <a name="GetVerticesWithDegreeLessThan-"></a> 884 <span class="k">sub </span><span class="m">GetVerticesWithDegreeLessThan</span> <span class="s">{</span> | 
|  | 898  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> | 
|  | 899  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> | 
|  | 900  887 | 
|  | 901  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> | 
|  | 902  889 | 
|  | 903  890   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 904  891   <span class="k">if</span> <span class="s">(</span>! <span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 905  892     <span class="k">return</span> <span class="i">@FilteredVertexIDs</span><span class="sc">;</span> | 
|  | 906  893   <span class="s">}</span> | 
|  | 907  894 | 
|  | 908  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> | 
|  | 909  896     <span class="i">$Degree</span> = <span class="i">$This</span><span class="i">->_GetInDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span> + <span class="i">$This</span><span class="i">->_GetOutDegree</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 910  897     <span class="k">if</span> <span class="s">(</span><span class="i">$Degree</span> < <span class="i">$SpecifiedDegree</span><span class="s">)</span> <span class="s">{</span> | 
|  | 911  898       <span class="k">push</span> <span class="i">@FilteredVertexIDs</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="sc">;</span> | 
|  | 912  899     <span class="s">}</span> | 
|  | 913  900   <span class="s">}</span> | 
|  | 914  901   <span class="k">return</span> <span class="i">@FilteredVertexIDs</span><span class="sc">;</span> | 
|  | 915  902 <span class="s">}</span> | 
|  | 916  903 | 
|  | 917  904 <span class="c"># Set a property for graph...</span> | 
|  | 918 <a name="SetGraphProperty-"></a> 905 <span class="k">sub </span><span class="m">SetGraphProperty</span> <span class="s">{</span> | 
|  | 919  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> | 
|  | 920  907 | 
|  | 921  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> && <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> | 
|  | 922  909     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetGraphProperty: Didn't set property: Both property name and value should be specified..."</span><span class="sc">;</span> | 
|  | 923  910     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 924  911   <span class="s">}</span> | 
|  | 925  912   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Graph</span>}->{<span class="i">$Name</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 926  913     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetGraphProperty: Didn't set property $Name: Already exists in the graph..."</span><span class="sc">;</span> | 
|  | 927  914     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 928  915   <span class="s">}</span> | 
|  | 929  916 | 
|  | 930  917   <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Graph</span>}->{<span class="i">$Name</span>} = <span class="i">$Value</span><span class="sc">;</span> | 
|  | 931  918 | 
|  | 932  919   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 933  920 <span class="s">}</span> | 
|  | 934  921 | 
|  | 935  922 <span class="c"># Set a properties for graph...</span> | 
|  | 936 <a name="SetGraphProperties-"></a> 923 <span class="k">sub </span><span class="m">SetGraphProperties</span> <span class="s">{</span> | 
|  | 937  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> | 
|  | 938  925 | 
|  | 939  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> | 
|  | 940  927     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetGraphProperties: Didn't set properties: Names and values list is empty..."</span><span class="sc">;</span> | 
|  | 941  928     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 942  929   <span class="s">}</span> | 
|  | 943  930 | 
|  | 944  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> | 
|  | 945  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> | 
|  | 946  933     <span class="i">$This</span><span class="i">->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> | 
|  | 947  934   <span class="s">}</span> | 
|  | 948  935 | 
|  | 949  936   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 950  937 <span class="s">}</span> | 
|  | 951  938 | 
|  | 952  939 <span class="c"># Get a property value for graph...</span> | 
|  | 953 <a name="GetGraphProperty-"></a> 940 <span class="k">sub </span><span class="m">GetGraphProperty</span> <span class="s">{</span> | 
|  | 954  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> | 
|  | 955  942 | 
|  | 956  943   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasGraphProperty</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 957  944     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 958  945   <span class="s">}</span> | 
|  | 959  946 | 
|  | 960  947   <span class="k">return</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Graph</span>}->{<span class="i">$Name</span>}<span class="sc">;</span> | 
|  | 961  948 <span class="s">}</span> | 
|  | 962  949 | 
|  | 963  950 <span class="c"># Get all poperty name/value pairs for graph...</span> | 
|  | 964 <a name="GetGraphProperties-"></a> 951 <span class="k">sub </span><span class="m">GetGraphProperties</span> <span class="s">{</span> | 
|  | 965  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> | 
|  | 966  953 | 
|  | 967  954   <span class="k">return</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Graph</span>}}<span class="sc">;</span> | 
|  | 968  955 <span class="s">}</span> | 
|  | 969  956 | 
|  | 970  957 <span class="c"># Delete a property for graph...</span> | 
|  | 971 <a name="DeleteGraphProperty-"></a> 958 <span class="k">sub </span><span class="m">DeleteGraphProperty</span> <span class="s">{</span> | 
|  | 972  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> | 
|  | 973  960 | 
|  | 974  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> | 
|  | 975  962     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteGraphProperty: Didn't delete graph property: Name must be specified..."</span><span class="sc">;</span> | 
|  | 976  963     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 977  964   <span class="s">}</span> | 
|  | 978  965   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasGraphProperty</span><span class="s">(</span><span class="i">$Name</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 979  966     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}-> DeleteGraphProperty: Didn't delete graph property $Name: Property doesn't exist..."</span><span class="sc">;</span> | 
|  | 980  967     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 981  968   <span class="s">}</span> | 
|  | 982  969   <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Graph</span>}->{<span class="i">$Name</span>}<span class="sc">;</span> | 
|  | 983  970 | 
|  | 984  971   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 985  972 <span class="s">}</span> | 
|  | 986  973 | 
|  | 987  974 <span class="c"># Delete graph properites...</span> | 
|  | 988 <a name="DeleteGraphProperties-"></a> 975 <span class="k">sub </span><span class="m">DeleteGraphProperties</span> <span class="s">{</span> | 
|  | 989  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> | 
|  | 990  977 | 
|  | 991  978   <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Graph</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 992  979 | 
|  | 993  980   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 994  981 <span class="s">}</span> | 
|  | 995  982 | 
|  | 996  983 | 
|  | 997  984 <span class="c"># Is this property associated with graph?</span> | 
|  | 998 <a name="HasGraphProperty-"></a> 985 <span class="k">sub </span><span class="m">HasGraphProperty</span> <span class="s">{</span> | 
|  | 999  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> | 
|  | 1000  987 | 
|  | 1001  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> | 
|  | 1002  989     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1003  990   <span class="s">}</span> | 
|  | 1004  991   <span class="k">return</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Graph</span>}->{<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> | 
|  | 1005  992 <span class="s">}</span> | 
|  | 1006  993 | 
|  | 1007  994 <span class="c"># Set a property for vertex...</span> | 
|  | 1008 <a name="SetVertexProperty-"></a> 995 <span class="k">sub </span><span class="m">SetVertexProperty</span> <span class="s">{</span> | 
|  | 1009  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> | 
|  | 1010  997 | 
|  | 1011  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> && <span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <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> | 
|  | 1012  999     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetVertexProperty: Didn't set property: Property name, value and vertexID should be specified..."</span><span class="sc">;</span> | 
|  | 1013 1000     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1014 1001   <span class="s">}</span> | 
|  | 1015 1002   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1016 1003     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetVertexProperty: Didn't set property $Name for vertex $VertexID: Vertex doesn't exist..."</span><span class="sc">;</span> | 
|  | 1017 1004     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1018 1005   <span class="s">}</span> | 
|  | 1019 1006   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->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> | 
|  | 1020 1007     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetVertexProperty: Didn't set property $Name for vertex $VertexID: Property already exists..."</span><span class="sc">;</span> | 
|  | 1021 1008     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1022 1009   <span class="s">}</span> | 
|  | 1023 1010 | 
|  | 1024 1011   <span class="i">$This</span><span class="i">->_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> | 
|  | 1025 1012 | 
|  | 1026 1013   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1027 1014 <span class="s">}</span> | 
|  | 1028 1015 | 
|  | 1029 1016 <span class="c"># Update a property for vertex...</span> | 
|  | 1030 <a name="UpdateVertexProperty-"></a>1017 <span class="k">sub </span><span class="m">UpdateVertexProperty</span> <span class="s">{</span> | 
|  | 1031 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> | 
|  | 1032 1019 | 
|  | 1033 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> && <span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span> && <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> | 
|  | 1034 1021     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->UpdateVextexProperty: Didn't update property: Property name, value and vertexID should be specified..."</span><span class="sc">;</span> | 
|  | 1035 1022     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1036 1023   <span class="s">}</span> | 
|  | 1037 1024   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1038 1025     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->UpdateVextexProperty: Didn't update property $Name for vertex $VertexID: Vertex doesn't exist..."</span><span class="sc">;</span> | 
|  | 1039 1026     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1040 1027   <span class="s">}</span> | 
|  | 1041 1028   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->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> | 
|  | 1042 1029     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->UpdateVextexProperty: Didn't update property $Name for vertex $VertexID: Property doesn't exists..."</span><span class="sc">;</span> | 
|  | 1043 1030     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1044 1031   <span class="s">}</span> | 
|  | 1045 1032   <span class="i">$This</span><span class="i">->_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> | 
|  | 1046 1033 | 
|  | 1047 1034   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1048 1035 <span class="s">}</span> | 
|  | 1049 1036 | 
|  | 1050 1037 <span class="c"># Set a vextex property...</span> | 
|  | 1051 <a name="_SetVertexProperty-"></a>1038 <span class="k">sub </span><span class="m">_SetVertexProperty</span> <span class="s">{</span> | 
|  | 1052 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> | 
|  | 1053 1040 | 
|  | 1054 1041   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1055 1042     <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1056 1043   <span class="s">}</span> | 
|  | 1057 1044   <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}->{<span class="i">$Name</span>} = <span class="i">$Value</span><span class="sc">;</span> | 
|  | 1058 1045 | 
|  | 1059 1046   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1060 1047 <span class="s">}</span> | 
|  | 1061 1048 | 
|  | 1062 1049 <span class="c"># Set a properties for vertex..</span> | 
|  | 1063 <a name="SetVertexProperties-"></a>1050 <span class="k">sub </span><span class="m">SetVertexProperties</span> <span class="s">{</span> | 
|  | 1064 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> | 
|  | 1065 1052 | 
|  | 1066 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> | 
|  | 1067 1054     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetVertexProperties: Didn't set property: VertexID should be specified..."</span><span class="sc">;</span> | 
|  | 1068 1055     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1069 1056   <span class="s">}</span> | 
|  | 1070 1057   <span class="k">if</span> <span class="s">(</span>!<span class="i">@NamesAndValues</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1071 1058     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetVertexProperties: Didn't set property: Names and values list is empty..."</span><span class="sc">;</span> | 
|  | 1072 1059     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1073 1060   <span class="s">}</span> | 
|  | 1074 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> | 
|  | 1075 1062     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetVertexProperties: Didn't set property: Invalid property name and values IDs data: Input list must contain even number of values..."</span><span class="sc">;</span> | 
|  | 1076 1063     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1077 1064   <span class="s">}</span> | 
|  | 1078 1065 | 
|  | 1079 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> | 
|  | 1080 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> < <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> | 
|  | 1081 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> | 
|  | 1082 1069     <span class="i">$This</span><span class="i">->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> | 
|  | 1083 1070   <span class="s">}</span> | 
|  | 1084 1071 | 
|  | 1085 1072   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1086 1073 <span class="s">}</span> | 
|  | 1087 1074 | 
|  | 1088 1075 | 
|  | 1089 1076 <span class="c"># Set a property for vertices...</span> | 
|  | 1090 <a name="SetVerticesProperty-"></a>1077 <span class="k">sub </span><span class="m">SetVerticesProperty</span> <span class="s">{</span> | 
|  | 1091 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> | 
|  | 1092 1079 | 
|  | 1093 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> | 
|  | 1094 1081     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetVerticesProperty: Didn't set property: Property name should be specified..."</span><span class="sc">;</span> | 
|  | 1095 1082     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1096 1083   <span class="s">}</span> | 
|  | 1097 1084   <span class="k">if</span> <span class="s">(</span>!<span class="i">@ValuesAndVertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1098 1085     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetVerticesProperty: Didn't set property: Values and vertex IDs list is empty..."</span><span class="sc">;</span> | 
|  | 1099 1086     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1100 1087   <span class="s">}</span> | 
|  | 1101 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> | 
|  | 1102 1089     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetVerticesProperty: Didn't set property: Invalid property values and vertex IDs data: Input list must contain even number of values..."</span><span class="sc">;</span> | 
|  | 1103 1090     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1104 1091   <span class="s">}</span> | 
|  | 1105 1092 | 
|  | 1106 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> | 
|  | 1107 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> < <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> | 
|  | 1108 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> | 
|  | 1109 1096     <span class="i">$This</span><span class="i">->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> | 
|  | 1110 1097   <span class="s">}</span> | 
|  | 1111 1098 | 
|  | 1112 1099   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1113 1100 <span class="s">}</span> | 
|  | 1114 1101 | 
|  | 1115 1102 <span class="c"># Get a property value for vertex...</span> | 
|  | 1116 <a name="GetVertexProperty-"></a>1103 <span class="k">sub </span><span class="m">GetVertexProperty</span> <span class="s">{</span> | 
|  | 1117 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> | 
|  | 1118 1105 | 
|  | 1119 1106   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->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> | 
|  | 1120 1107     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1121 1108   <span class="s">}</span> | 
|  | 1122 1109 | 
|  | 1123 1110   <span class="k">return</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}->{<span class="i">$Name</span>}<span class="sc">;</span> | 
|  | 1124 1111 <span class="s">}</span> | 
|  | 1125 1112 | 
|  | 1126 1113 <span class="c"># Get a property values for vertices...</span> | 
|  | 1127 <a name="GetVerticesProperty-"></a>1114 <span class="k">sub </span><span class="m">GetVerticesProperty</span> <span class="s">{</span> | 
|  | 1128 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> | 
|  | 1129 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> | 
|  | 1130 1117 | 
|  | 1131 1118   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1132 1119     <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1133 1120     <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1134 1121   <span class="s">}</span> | 
|  | 1135 1122   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1136 1123   <span class="i">@Values</span> = <span class="k">map</span> <span class="s">{</span> <span class="i">$This</span><span class="i">->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> | 
|  | 1137 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> | 
|  | 1138 1125 | 
|  | 1139 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> | 
|  | 1140 1127 <span class="s">}</span> | 
|  | 1141 1128 | 
|  | 1142 1129 <span class="c"># Get all property name/values pairs for vertex...</span> | 
|  | 1143 <a name="GetVertexProperties-"></a>1130 <span class="k">sub </span><span class="m">GetVertexProperties</span> <span class="s">{</span> | 
|  | 1144 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> | 
|  | 1145 1132 | 
|  | 1146 1133   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1147 1134     <span class="k">return</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1148 1135   <span class="s">}</span> | 
|  | 1149 1136 | 
|  | 1150 1137   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1151 1138     <span class="k">return</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}}<span class="sc">;</span> | 
|  | 1152 1139   <span class="s">}</span> | 
|  | 1153 1140   <span class="k">else</span> <span class="s">{</span> | 
|  | 1154 1141     <span class="k">return</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1155 1142   <span class="s">}</span> | 
|  | 1156 1143 <span class="s">}</span> | 
|  | 1157 1144 | 
|  | 1158 1145 | 
|  | 1159 1146 <span class="c"># Delete a property for vertex...</span> | 
|  | 1160 <a name="DeleteVertexProperty-"></a>1147 <span class="k">sub </span><span class="m">DeleteVertexProperty</span> <span class="s">{</span> | 
|  | 1161 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> | 
|  | 1162 1149 | 
|  | 1163 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> && <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> | 
|  | 1164 1151     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteVertexProperty: Didn't delete property: Property name and vertex ID must be defined..."</span><span class="sc">;</span> | 
|  | 1165 1152     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1166 1153   <span class="s">}</span> | 
|  | 1167 1154   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->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> | 
|  | 1168 1155     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteVertexProperty: Didn't delete property $Name for vertex $VertexID: Vertex property doesn't exist..."</span><span class="sc">;</span> | 
|  | 1169 1156     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1170 1157   <span class="s">}</span> | 
|  | 1171 1158   <span class="i">$This</span><span class="i">->_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> | 
|  | 1172 1159 | 
|  | 1173 1160   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1174 1161 <span class="s">}</span> | 
|  | 1175 1162 | 
|  | 1176 1163 <span class="c"># Delete vertex property or all properties...</span> | 
|  | 1177 <a name="_DeleteVertexProperty-"></a>1164 <span class="k">sub </span><span class="m">_DeleteVertexProperty</span> <span class="s">{</span> | 
|  | 1178 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> | 
|  | 1179 1166 | 
|  | 1180 1167   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1181 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> | 
|  | 1182 1169       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}->{<span class="i">$Name</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1183 1170         <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}->{<span class="i">$Name</span>}<span class="sc">;</span> | 
|  | 1184 1171       <span class="s">}</span> | 
|  | 1185 1172     <span class="s">}</span> | 
|  | 1186 1173     <span class="k">else</span> <span class="s">{</span> | 
|  | 1187 1174       <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1188 1175     <span class="s">}</span> | 
|  | 1189 1176     <span class="k">if</span> <span class="s">(</span>! <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}}<span class="s">)</span> <span class="s">{</span> | 
|  | 1190 1177       <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}<span class="sc">;</span> | 
|  | 1191 1178     <span class="s">}</span> | 
|  | 1192 1179   <span class="s">}</span> | 
|  | 1193 1180   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1194 1181 <span class="s">}</span> | 
|  | 1195 1182 | 
|  | 1196 1183 <span class="c"># Delete a property for specified vertices or all the vertices...</span> | 
|  | 1197 <a name="DeleteVerticesProperty-"></a>1184 <span class="k">sub </span><span class="m">DeleteVerticesProperty</span> <span class="s">{</span> | 
|  | 1198 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> | 
|  | 1199 1186 | 
|  | 1200 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> | 
|  | 1201 1188     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteVerticesProperty: Didn't delete property: Property name should be specified..."</span><span class="sc">;</span> | 
|  | 1202 1189     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1203 1190   <span class="s">}</span> | 
|  | 1204 1191   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1205 1192     <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1206 1193     <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1207 1194   <span class="s">}</span> | 
|  | 1208 1195   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1209 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> | 
|  | 1210 1197     <span class="i">$This</span><span class="i">->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> | 
|  | 1211 1198   <span class="s">}</span> | 
|  | 1212 1199 | 
|  | 1213 1200   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1214 1201 <span class="s">}</span> | 
|  | 1215 1202 | 
|  | 1216 1203 <span class="c"># Delete all properities for vertex...</span> | 
|  | 1217 <a name="DeleteVertexProperties-"></a>1204 <span class="k">sub </span><span class="m">DeleteVertexProperties</span> <span class="s">{</span> | 
|  | 1218 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> | 
|  | 1219 1206 | 
|  | 1220 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> | 
|  | 1221 1208     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteVertexProperties: Didn't delete properties: Vertex ID must be defined..."</span><span class="sc">;</span> | 
|  | 1222 1209     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1223 1210   <span class="s">}</span> | 
|  | 1224 1211   <span class="i">$This</span><span class="i">->_DeleteVertexProperty</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1225 1212 | 
|  | 1226 1213   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1227 1214 <span class="s">}</span> | 
|  | 1228 1215 | 
|  | 1229 1216 <span class="c"># Is this property associated with vertex?</span> | 
|  | 1230 <a name="HasVertexProperty-"></a>1217 <span class="k">sub </span><span class="m">HasVertexProperty</span> <span class="s">{</span> | 
|  | 1231 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> | 
|  | 1232 1219 | 
|  | 1233 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> && <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> | 
|  | 1234 1221     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1235 1222   <span class="s">}</span> | 
|  | 1236 1223 | 
|  | 1237 1224   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1238 1225     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Vertices</span>}->{<span class="i">$VertexID</span>}->{<span class="i">$Name</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1239 1226       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1240 1227     <span class="s">}</span> | 
|  | 1241 1228   <span class="s">}</span> | 
|  | 1242 1229   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1243 1230 <span class="s">}</span> | 
|  | 1244 1231 | 
|  | 1245 1232 <span class="c"># Set a property for edge...</span> | 
|  | 1246 <a name="SetEdgeProperty-"></a>1233 <span class="k">sub </span><span class="m">SetEdgeProperty</span> <span class="s">{</span> | 
|  | 1247 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> | 
|  | 1248 1235 | 
|  | 1249 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> && <span class="k">defined</span><span class="s">(</span><span class="i">$Value</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="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> | 
|  | 1250 1237     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetEdgeProperty: Didn't set property: Property name, value, vertexID1 and vertexID2 should be specified..."</span><span class="sc">;</span> | 
|  | 1251 1238     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1252 1239   <span class="s">}</span> | 
|  | 1253 1240   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->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> | 
|  | 1254 1241     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetEdgeProperty: Didn't set property $Name for edge between vertices $VertexID1 and $VertexID2: Edge doesn't exist..."</span><span class="sc">;</span> | 
|  | 1255 1242     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1256 1243   <span class="s">}</span> | 
|  | 1257 1244   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->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> | 
|  | 1258 1245     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetEdgeProperty: Didn't set property $Name for edge between vertices $VertexID1 and $VertexID2: Edge property already exists..."</span><span class="sc">;</span> | 
|  | 1259 1246     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1260 1247   <span class="s">}</span> | 
|  | 1261 1248   <span class="i">$This</span><span class="i">->_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> | 
|  | 1262 1249   <span class="i">$This</span><span class="i">->_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> | 
|  | 1263 1250 | 
|  | 1264 1251   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1265 1252 <span class="s">}</span> | 
|  | 1266 1253 | 
|  | 1267 1254 <span class="c"># Update a property for edge...</span> | 
|  | 1268 <a name="UpdateEdgeProperty-"></a>1255 <span class="k">sub </span><span class="m">UpdateEdgeProperty</span> <span class="s">{</span> | 
|  | 1269 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> | 
|  | 1270 1257 | 
|  | 1271 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> && <span class="k">defined</span><span class="s">(</span><span class="i">$Value</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="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> | 
|  | 1272 1259     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->UpdateEdgeProperty: Didn't update property: Property name, value, vertexID1 and vertexID2 should be specified..."</span><span class="sc">;</span> | 
|  | 1273 1260     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1274 1261   <span class="s">}</span> | 
|  | 1275 1262   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->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> | 
|  | 1276 1263     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->UpdateEdgeProperty: Didn't update property $Name for edge between vertices $VertexID1 and $VertexID2: Edge doesn't exist..."</span><span class="sc">;</span> | 
|  | 1277 1264     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1278 1265   <span class="s">}</span> | 
|  | 1279 1266   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->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> | 
|  | 1280 1267     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->UpdateEdgeProperty: Didn't update property $Name for edge between vertices $VertexID1 and $VertexID2: Edge property doesn't exists..."</span><span class="sc">;</span> | 
|  | 1281 1268     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1282 1269   <span class="s">}</span> | 
|  | 1283 1270   <span class="i">$This</span><span class="i">->_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> | 
|  | 1284 1271   <span class="i">$This</span><span class="i">->_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> | 
|  | 1285 1272 | 
|  | 1286 1273   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1287 1274 <span class="s">}</span> | 
|  | 1288 1275 <span class="c"># Set a property for edges...</span> | 
|  | 1289 <a name="SetEdgesProperty-"></a>1276 <span class="k">sub </span><span class="m">SetEdgesProperty</span> <span class="s">{</span> | 
|  | 1290 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> | 
|  | 1291 1278 | 
|  | 1292 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> | 
|  | 1293 1280     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetEdgesProperty: Didn't set property: Property name should be specified..."</span><span class="sc">;</span> | 
|  | 1294 1281     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1295 1282   <span class="s">}</span> | 
|  | 1296 1283   <span class="k">if</span> <span class="s">(</span>!<span class="i">@ValuesAndVertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1297 1284     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetEdgesProperty: Didn't set property: Values and vertex IDs list is empty..."</span><span class="sc">;</span> | 
|  | 1298 1285     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1299 1286   <span class="s">}</span> | 
|  | 1300 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> | 
|  | 1301 1288     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetEdgesProperty: Didn't set property: Invalid property values and vertex IDs data: Input list must contain triplets of values..."</span><span class="sc">;</span> | 
|  | 1302 1289     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1303 1290   <span class="s">}</span> | 
|  | 1304 1291 | 
|  | 1305 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> | 
|  | 1306 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> < <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> | 
|  | 1307 1294     <span class="i">$Value</span> = <span class="i">$ValuesAndVertexIDs</span>[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1308 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> | 
|  | 1309 1296     <span class="i">$This</span><span class="i">->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> | 
|  | 1310 1297   <span class="s">}</span> | 
|  | 1311 1298 | 
|  | 1312 1299   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1313 1300 <span class="s">}</span> | 
|  | 1314 1301 | 
|  | 1315 1302 <span class="c"># Set a properties for a edge...</span> | 
|  | 1316 <a name="SetEdgeProperties-"></a>1303 <span class="k">sub </span><span class="m">SetEdgeProperties</span> <span class="s">{</span> | 
|  | 1317 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> | 
|  | 1318 1305 | 
|  | 1319 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> && <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> | 
|  | 1320 1307     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetEdgeProperties: Didn't set property: Both vertexID1 and vertexID2 should be specified..."</span><span class="sc">;</span> | 
|  | 1321 1308     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1322 1309   <span class="s">}</span> | 
|  | 1323 1310   <span class="k">if</span> <span class="s">(</span>!<span class="i">@NamesAndValues</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1324 1311     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetEdgeProperties: Didn't set property: Property name and values ist is empty..."</span><span class="sc">;</span> | 
|  | 1325 1312     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1326 1313   <span class="s">}</span> | 
|  | 1327 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> | 
|  | 1328 1315     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetEdgeProperties: Didn't set property: Invalid property name and values data: Input list must contain triplets of values..."</span><span class="sc">;</span> | 
|  | 1329 1316     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1330 1317   <span class="s">}</span> | 
|  | 1331 1318 | 
|  | 1332 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> | 
|  | 1333 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> < <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> | 
|  | 1334 1321     <span class="i">$Name</span> = <span class="i">$NamesAndValues</span>[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1335 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> | 
|  | 1336 1323     <span class="i">$This</span><span class="i">->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> | 
|  | 1337 1324   <span class="s">}</span> | 
|  | 1338 1325 | 
|  | 1339 1326   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1340 1327 <span class="s">}</span> | 
|  | 1341 1328 | 
|  | 1342 1329 <span class="c"># Set edge property...</span> | 
|  | 1343 <a name="_SetEdgeProperty-"></a>1330 <span class="k">sub </span><span class="m">_SetEdgeProperty</span> <span class="s">{</span> | 
|  | 1344 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> | 
|  | 1345 1332 | 
|  | 1346 1333   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1347 1334     <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1348 1335   <span class="s">}</span> | 
|  | 1349 1336   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1350 1337     <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1351 1338   <span class="s">}</span> | 
|  | 1352 1339   <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}->{<span class="i">$Name</span>} = <span class="i">$Value</span><span class="sc">;</span> | 
|  | 1353 1340 | 
|  | 1354 1341   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1355 1342 <span class="s">}</span> | 
|  | 1356 1343 | 
|  | 1357 1344 <span class="c"># Get a property value for edge...</span> | 
|  | 1358 <a name="GetEdgeProperty-"></a>1345 <span class="k">sub </span><span class="m">GetEdgeProperty</span> <span class="s">{</span> | 
|  | 1359 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> | 
|  | 1360 1347 | 
|  | 1361 1348   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->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> | 
|  | 1362 1349     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1363 1350   <span class="s">}</span> | 
|  | 1364 1351   <span class="k">return</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}->{<span class="i">$Name</span>}<span class="sc">;</span> | 
|  | 1365 1352 <span class="s">}</span> | 
|  | 1366 1353 | 
|  | 1367 1354 <span class="c"># Get a property values for edges...</span> | 
|  | 1368 <a name="GetEdgesProperty-"></a>1355 <span class="k">sub </span><span class="m">GetEdgesProperty</span> <span class="s">{</span> | 
|  | 1369 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> | 
|  | 1370 1357 | 
|  | 1371 1358   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1372 1359     <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1373 1360     <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1374 1361   <span class="s">}</span> | 
|  | 1375 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> | 
|  | 1376 1363     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1377 1364   <span class="s">}</span> | 
|  | 1378 1365 | 
|  | 1379 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> | 
|  | 1380 1367   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1381 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> < <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> | 
|  | 1382 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> | 
|  | 1383 1370     <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span><span class="i">->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> | 
|  | 1384 1371   <span class="s">}</span> | 
|  | 1385 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> | 
|  | 1386 1373 | 
|  | 1387 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> | 
|  | 1388 1375 <span class="s">}</span> | 
|  | 1389 1376 | 
|  | 1390 1377 <span class="c"># Get all property name/value paries for edge...</span> | 
|  | 1391 <a name="GetEdgeProperties-"></a>1378 <span class="k">sub </span><span class="m">GetEdgeProperties</span> <span class="s">{</span> | 
|  | 1392 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> | 
|  | 1393 1380 | 
|  | 1394 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> && <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> | 
|  | 1395 1382     <span class="k">return</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1396 1383   <span class="s">}</span> | 
|  | 1397 1384   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1398 1385     <span class="k">return</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1399 1386   <span class="s">}</span> | 
|  | 1400 1387   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1401 1388     <span class="k">return</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1402 1389   <span class="s">}</span> | 
|  | 1403 1390   <span class="k">return</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}}<span class="sc">;</span> | 
|  | 1404 1391 <span class="s">}</span> | 
|  | 1405 1392 | 
|  | 1406 1393 <span class="c"># Delete a property for edge...</span> | 
|  | 1407 <a name="DeleteEdgeProperty-"></a>1394 <span class="k">sub </span><span class="m">DeleteEdgeProperty</span> <span class="s">{</span> | 
|  | 1408 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> | 
|  | 1409 1396 | 
|  | 1410 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> && <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</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> <span class="s">{</span> | 
|  | 1411 1398     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteEdgeProperty: Didn't delete property: Property name, vertexID1 and vertexID2 should be specified..."</span><span class="sc">;</span> | 
|  | 1412 1399     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1413 1400   <span class="s">}</span> | 
|  | 1414 1401   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->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> | 
|  | 1415 1402     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteEdgeProperty: Didn't delete property $Name for edge between vertices $VertexID1 and $VertexID2: Edge property doesn't exist..."</span><span class="sc">;</span> | 
|  | 1416 1403     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1417 1404   <span class="s">}</span> | 
|  | 1418 1405   <span class="i">$This</span><span class="i">->_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> | 
|  | 1419 1406   <span class="i">$This</span><span class="i">->_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> | 
|  | 1420 1407 | 
|  | 1421 1408   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1422 1409 <span class="s">}</span> | 
|  | 1423 1410 | 
|  | 1424 1411 <span class="c"># Delete a property for edges...</span> | 
|  | 1425 <a name="DeleteEdgesProperty-"></a>1412 <span class="k">sub </span><span class="m">DeleteEdgesProperty</span> <span class="s">{</span> | 
|  | 1426 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> | 
|  | 1427 1414 | 
|  | 1428 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> | 
|  | 1429 1416     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteEdgesProperty: Didn't delete property: Property name should be specified..."</span><span class="sc">;</span> | 
|  | 1430 1417     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1431 1418   <span class="s">}</span> | 
|  | 1432 1419   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1433 1420     <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1434 1421     <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1435 1422   <span class="s">}</span> | 
|  | 1436 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> | 
|  | 1437 1424     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteEdgesProperty: Didn't set property: Invalid property values and vertex IDs data: Input list must contain even number of values..."</span><span class="sc">;</span> | 
|  | 1438 1425     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1439 1426   <span class="s">}</span> | 
|  | 1440 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> | 
|  | 1441 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> < <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> | 
|  | 1442 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> | 
|  | 1443 1430     <span class="i">$This</span><span class="i">->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> | 
|  | 1444 1431   <span class="s">}</span> | 
|  | 1445 1432 | 
|  | 1446 1433   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1447 1434 <span class="s">}</span> | 
|  | 1448 1435 | 
|  | 1449 1436 <span class="c"># Delete all properties for edge...</span> | 
|  | 1450 <a name="DeleteEdgeProperties-"></a>1437 <span class="k">sub </span><span class="m">DeleteEdgeProperties</span> <span class="s">{</span> | 
|  | 1451 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> | 
|  | 1452 1439 | 
|  | 1453 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> && <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> | 
|  | 1454 1441     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteEdgeProperties: Didn't delete property: VertexID1 and vertexID2 should be specified..."</span><span class="sc">;</span> | 
|  | 1455 1442     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1456 1443   <span class="s">}</span> | 
|  | 1457 1444   <span class="i">$This</span><span class="i">->_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> | 
|  | 1458 1445   <span class="i">$This</span><span class="i">->_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> | 
|  | 1459 1446 | 
|  | 1460 1447   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1461 1448 <span class="s">}</span> | 
|  | 1462 1449 | 
|  | 1463 1450 <span class="c"># Delete properties for edges...</span> | 
|  | 1464 <a name="DeleteEdgesProperties-"></a>1451 <span class="k">sub </span><span class="m">DeleteEdgesProperties</span> <span class="s">{</span> | 
|  | 1465 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> | 
|  | 1466 1453 | 
|  | 1467 1454   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1468 1455     <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1469 1456     <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1470 1457   <span class="s">}</span> | 
|  | 1471 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> | 
|  | 1472 1459     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteEdgesProperty: Didn't set property: Invalid property values and vertex IDs data: Input list must contain even number of values..."</span><span class="sc">;</span> | 
|  | 1473 1460     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1474 1461   <span class="s">}</span> | 
|  | 1475 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> | 
|  | 1476 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> < <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> | 
|  | 1477 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> | 
|  | 1478 1465     <span class="i">$This</span><span class="i">->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> | 
|  | 1479 1466   <span class="s">}</span> | 
|  | 1480 1467   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1481 1468 <span class="s">}</span> | 
|  | 1482 1469 | 
|  | 1483 1470 | 
|  | 1484 1471 <span class="c"># Delete a specific edge property or all edge properties...</span> | 
|  | 1485 <a name="_DeleteEdgeProperty-"></a>1472 <span class="k">sub </span><span class="m">_DeleteEdgeProperty</span> <span class="s">{</span> | 
|  | 1486 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> | 
|  | 1487 1474 | 
|  | 1488 1475   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1489 1476     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1490 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> | 
|  | 1491 1478         <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}->{<span class="i">$Name</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1492 1479           <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}->{<span class="i">$Name</span>}<span class="sc">;</span> | 
|  | 1493 1480         <span class="s">}</span> | 
|  | 1494 1481       <span class="s">}</span> | 
|  | 1495 1482       <span class="k">else</span> <span class="s">{</span> | 
|  | 1496 1483         <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1497 1484       <span class="s">}</span> | 
|  | 1498 1485       <span class="k">if</span> <span class="s">(</span>! <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}}<span class="s">)</span> <span class="s">{</span> | 
|  | 1499 1486         <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}<span class="sc">;</span> | 
|  | 1500 1487       <span class="s">}</span> | 
|  | 1501 1488     <span class="s">}</span> | 
|  | 1502 1489     <span class="k">if</span> <span class="s">(</span>! <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}}<span class="s">)</span> <span class="s">{</span> | 
|  | 1503 1490       <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}<span class="sc">;</span> | 
|  | 1504 1491     <span class="s">}</span> | 
|  | 1505 1492   <span class="s">}</span> | 
|  | 1506 1493 | 
|  | 1507 1494   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1508 1495 <span class="s">}</span> | 
|  | 1509 1496 | 
|  | 1510 1497 <span class="c"># Is this property associated with edge?</span> | 
|  | 1511 <a name="HasEdgeProperty-"></a>1498 <span class="k">sub </span><span class="m">HasEdgeProperty</span> <span class="s">{</span> | 
|  | 1512 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> | 
|  | 1513 1500 | 
|  | 1514 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> && <span class="k">defined</span><span class="s">(</span><span class="i">$VertexID1</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> <span class="s">{</span> | 
|  | 1515 1502     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1516 1503   <span class="s">}</span> | 
|  | 1517 1504   <span class="k">my</span><span class="s">(</span><span class="i">$Status</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1518 1505 | 
|  | 1519 1506   <span class="i">$Status</span> = <span class="s">(</span><span class="i">$This</span><span class="i">->_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">->_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> | 
|  | 1520 1507 | 
|  | 1521 1508   <span class="k">return</span> <span class="i">$Status</span><span class="sc">;</span> | 
|  | 1522 1509 <span class="s">}</span> | 
|  | 1523 1510 | 
|  | 1524 1511 <span class="c"># Does edge proprty exists?</span> | 
|  | 1525 <a name="_HasEdgeProperty-"></a>1512 <span class="k">sub </span><span class="m">_HasEdgeProperty</span> <span class="s">{</span> | 
|  | 1526 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> | 
|  | 1527 1514 | 
|  | 1528 1515   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1529 1516     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1530 1517       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Properties</span>}->{<span class="w">Edges</span>}->{<span class="i">$VertexID1</span>}->{<span class="i">$VertexID2</span>}->{<span class="i">$Name</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 1531 1518         <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1532 1519       <span class="s">}</span> | 
|  | 1533 1520     <span class="s">}</span> | 
|  | 1534 1521   <span class="s">}</span> | 
|  | 1535 1522   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1536 1523 <span class="s">}</span> | 
|  | 1537 1524 | 
|  | 1538 1525 <span class="c"># Is it a graph object?</span> | 
|  | 1539 <a name="IsGraph-"></a>1526 <span class="k">sub </span><span class="m">IsGraph ($)</span> <span class="s">{</span> | 
|  | 1540 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> | 
|  | 1541 1528 | 
|  | 1542 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> | 
|  | 1543 1530 <span class="s">}</span> | 
|  | 1544 1531 | 
|  | 1545 1532 <span class="c"># Return a string containg vertices, edges and other properties...</span> | 
|  | 1546 <a name="StringifyGraph-"></a>1533 <span class="k">sub </span><span class="m">StringifyGraph</span> <span class="s">{</span> | 
|  | 1547 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> | 
|  | 1548 1535   <span class="k">my</span><span class="s">(</span><span class="i">$GraphString</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1549 1536 | 
|  | 1550 1537   <span class="i">$GraphString</span> = <span class="q">'Graph:'</span> . <span class="i">$This</span><span class="i">->StringifyVerticesAndEdges</span><span class="s">(</span><span class="s">)</span> . <span class="q">'; '</span> . <span class="i">$This</span><span class="i">->StringifyProperties</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1551 1538 | 
|  | 1552 1539   <span class="k">return</span> <span class="i">$GraphString</span><span class="sc">;</span> | 
|  | 1553 1540 <span class="s">}</span> | 
|  | 1554 1541 | 
|  | 1555 1542 <span class="c"># Return a string containg vertices, edges and other properties...</span> | 
|  | 1556 <a name="StringifyProperties-"></a>1543 <span class="k">sub </span><span class="m">StringifyProperties</span> <span class="s">{</span> | 
|  | 1557 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> | 
|  | 1558 1545   <span class="k">my</span><span class="s">(</span><span class="i">$PropertiesString</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1559 1546 | 
|  | 1560 1547   <span class="i">$PropertiesString</span> = <span class="i">$This</span><span class="i">->StringifyGraphProperties</span><span class="s">(</span><span class="s">)</span> . <span class="q">'; '</span> . <span class="i">$This</span><span class="i">->StringifyVerticesProperties</span><span class="s">(</span><span class="s">)</span>. <span class="q">'; '</span> . <span class="i">$This</span><span class="i">->StringifyEdgesProperties</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1561 1548 | 
|  | 1562 1549   <span class="k">return</span> <span class="i">$PropertiesString</span><span class="sc">;</span> | 
|  | 1563 1550 <span class="s">}</span> | 
|  | 1564 1551 | 
|  | 1565 1552 <span class="c"># Return a string containg vertices and edges...</span> | 
|  | 1566 <a name="StringifyVerticesAndEdges-"></a>1553 <span class="k">sub </span><span class="m">StringifyVerticesAndEdges</span> <span class="s">{</span> | 
|  | 1567 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> | 
|  | 1568 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> | 
|  | 1569 1556 | 
|  | 1570 1557   <span class="c"># Get vertices and edges...</span> | 
|  | 1571 1558   <span class="i">$GraphString</span> = <span class="q">''</span><span class="sc">;</span> | 
|  | 1572 1559   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1573 1560   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1574 1561   <span class="i">$Count</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1575 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> | 
|  | 1576 1563     <span class="i">$Count</span>++<span class="sc">;</span> | 
|  | 1577 1564     <span class="i">@EdgeVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1578 1565     <span class="i">@EdgeVertexIDs</span> = <span class="i">$This</span><span class="i">->_GetEdgesFrom</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1579 1566     <span class="k">if</span> <span class="s">(</span><span class="i">@EdgeVertexIDs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1580 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> < <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> | 
|  | 1581 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> | 
|  | 1582 1569         <span class="i">$GraphString</span> .= <span class="q">" ${VertexID1}-${VertexID2}"</span><span class="sc">;</span> | 
|  | 1583 1570       <span class="s">}</span> | 
|  | 1584 1571     <span class="s">}</span> | 
|  | 1585 1572     <span class="k">else</span> <span class="s">{</span> | 
|  | 1586 1573       <span class="i">$GraphString</span> .= <span class="q">" ${VertexID}"</span><span class="sc">;</span> | 
|  | 1587 1574     <span class="s">}</span> | 
|  | 1588 1575   <span class="s">}</span> | 
|  | 1589 1576   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Count</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1590 1577     <span class="i">$GraphString</span> = <span class="q">'Graph: None'</span><span class="sc">;</span> | 
|  | 1591 1578   <span class="s">}</span> | 
|  | 1592 1579   <span class="k">return</span> <span class="i">$GraphString</span><span class="sc">;</span> | 
|  | 1593 1580 <span class="s">}</span> | 
|  | 1594 1581 | 
|  | 1595 1582 <span class="c"># Return a string containg graph properties...</span> | 
|  | 1596 <a name="StringifyGraphProperties-"></a>1583 <span class="k">sub </span><span class="m">StringifyGraphProperties</span> <span class="s">{</span> | 
|  | 1597 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> | 
|  | 1598 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> | 
|  | 1599 1586 | 
|  | 1600 1587   <span class="i">$GraphPropertyString</span> = <span class="q">"GraphProperties: "</span><span class="sc">;</span> | 
|  | 1601 1588   <span class="i">%GraphProperties</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1602 1589   <span class="i">%GraphProperties</span> = <span class="i">$This</span><span class="i">->GetGraphProperties</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1603 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> | 
|  | 1604 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> | 
|  | 1605 1592       <span class="i">$Value</span> = <span class="i">$GraphProperties</span>{<span class="i">$Name</span>}<span class="sc">;</span> | 
|  | 1606 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> | 
|  | 1607 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> | 
|  | 1608 1595           <span class="i">$GraphPropertyString</span> .= <span class="q">" ${Name}=(Count: "</span> . <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$Value</span>} . <span class="q">"; "</span> . <span class="k">join</span><span class="s">(</span><span class="q">', '</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$Value</span>}<span class="s">)</span> .  <span class="q">")"</span><span class="sc">;</span> | 
|  | 1609 1596         <span class="s">}</span> | 
|  | 1610 1597         <span class="k">else</span> <span class="s">{</span> | 
|  | 1611 1598           <span class="i">$GraphPropertyString</span> .= <span class="q">" ${Name}=None"</span><span class="sc">;</span> | 
|  | 1612 1599         <span class="s">}</span> | 
|  | 1613 1600       <span class="s">}</span> | 
|  | 1614 1601       <span class="k">else</span> <span class="s">{</span> | 
|  | 1615 1602         <span class="i">$GraphPropertyString</span> .= <span class="q">" ${Name}=${Value}"</span><span class="sc">;</span> | 
|  | 1616 1603       <span class="s">}</span> | 
|  | 1617 1604     <span class="s">}</span> | 
|  | 1618 1605   <span class="s">}</span> | 
|  | 1619 1606   <span class="k">else</span> <span class="s">{</span> | 
|  | 1620 1607     <span class="i">$GraphPropertyString</span> .= <span class="q">" None"</span><span class="sc">;</span> | 
|  | 1621 1608   <span class="s">}</span> | 
|  | 1622 1609   <span class="k">return</span> <span class="i">$GraphPropertyString</span><span class="sc">;</span> | 
|  | 1623 1610 <span class="s">}</span> | 
|  | 1624 1611 | 
|  | 1625 1612 <span class="c"># Return a string containg vertices  properties...</span> | 
|  | 1626 <a name="StringifyVerticesProperties-"></a>1613 <span class="k">sub </span><span class="m">StringifyVerticesProperties</span> <span class="s">{</span> | 
|  | 1627 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> | 
|  | 1628 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> | 
|  | 1629 1616 | 
|  | 1630 1617   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1631 1618   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1632 1619   <span class="i">$Count</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1633 1620   <span class="i">$VertexPropertyString</span> = <span class="q">"VertexProperties:"</span><span class="sc">;</span> | 
|  | 1634 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> | 
|  | 1635 1622     <span class="i">%VertexProperties</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1636 1623     <span class="i">%VertexProperties</span> = <span class="i">$This</span><span class="i">->GetVertexProperties</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1637 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> | 
|  | 1638 1625       <span class="i">$Count</span>++<span class="sc">;</span> | 
|  | 1639 1626       <span class="i">$VertexPropertyString</span> .= <span class="q">" <Vertex ${VertexID}: "</span><span class="sc">;</span> | 
|  | 1640 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> | 
|  | 1641 1628         <span class="i">$Value</span> = <span class="i">$VertexProperties</span>{<span class="i">$Name</span>}<span class="sc">;</span> | 
|  | 1642 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> | 
|  | 1643 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> | 
|  | 1644 1631             <span class="i">$VertexPropertyString</span> .= <span class="q">" ${Name}=("</span> . <span class="k">join</span><span class="s">(</span><span class="q">', '</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$Value</span>}<span class="s">)</span> .  <span class="q">")"</span><span class="sc">;</span> | 
|  | 1645 1632           <span class="s">}</span> | 
|  | 1646 1633           <span class="k">else</span> <span class="s">{</span> | 
|  | 1647 1634             <span class="i">$VertexPropertyString</span> .= <span class="q">" ${Name}=None"</span><span class="sc">;</span> | 
|  | 1648 1635           <span class="s">}</span> | 
|  | 1649 1636         <span class="s">}</span> | 
|  | 1650 1637         <span class="k">else</span> <span class="s">{</span> | 
|  | 1651 1638           <span class="i">$VertexPropertyString</span> .= <span class="q">" ${Name}=${Value}"</span><span class="sc">;</span> | 
|  | 1652 1639         <span class="s">}</span> | 
|  | 1653 1640       <span class="s">}</span> | 
|  | 1654 1641       <span class="i">$VertexPropertyString</span> .= <span class="q">">"</span><span class="sc">;</span> | 
|  | 1655 1642     <span class="s">}</span> | 
|  | 1656 1643   <span class="s">}</span> | 
|  | 1657 1644   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Count</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1658 1645     <span class="i">$VertexPropertyString</span> = <span class="q">"VertexProperties: None"</span><span class="sc">;</span> | 
|  | 1659 1646   <span class="s">}</span> | 
|  | 1660 1647   <span class="k">return</span> <span class="i">$VertexPropertyString</span><span class="sc">;</span> | 
|  | 1661 1648 <span class="s">}</span> | 
|  | 1662 1649 | 
|  | 1663 1650 <span class="c"># Return a string containg edges properties...</span> | 
|  | 1664 <a name="StringifyEdgesProperties-"></a>1651 <span class="k">sub </span><span class="m">StringifyEdgesProperties</span> <span class="s">{</span> | 
|  | 1665 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> | 
|  | 1666 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> | 
|  | 1667 1654 | 
|  | 1668 1655   <span class="i">@EdgesVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1669 1656   <span class="i">@EdgesVertexIDs</span> = <span class="i">$This</span><span class="i">->GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1670 1657   <span class="i">$Count</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1671 1658   <span class="i">$EdgePropertyString</span> = <span class="q">"EdgeProperties:"</span><span class="sc">;</span> | 
|  | 1672 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> < <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> | 
|  | 1673 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> | 
|  | 1674 1661     <span class="i">%EdgeProperties</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1675 1662     <span class="i">%EdgeProperties</span> = <span class="i">$This</span><span class="i">->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> | 
|  | 1676 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> | 
|  | 1677 1664       <span class="i">$Count</span>++<span class="sc">;</span> | 
|  | 1678 1665       <span class="i">$EdgePropertyString</span> .= <span class="q">" <Edge ${VertexID1}-${VertexID2}:"</span><span class="sc">;</span> | 
|  | 1679 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> | 
|  | 1680 1667         <span class="i">$Value</span> = <span class="i">$EdgeProperties</span>{<span class="i">$Name</span>}<span class="sc">;</span> | 
|  | 1681 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> | 
|  | 1682 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> | 
|  | 1683 1670             <span class="i">$EdgePropertyString</span> .= <span class="q">" ${Name}=("</span> . <span class="k">join</span><span class="s">(</span><span class="q">', '</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$Value</span>}<span class="s">)</span> .  <span class="q">")"</span><span class="sc">;</span> | 
|  | 1684 1671           <span class="s">}</span> | 
|  | 1685 1672           <span class="k">else</span> <span class="s">{</span> | 
|  | 1686 1673             <span class="i">$EdgePropertyString</span> .= <span class="q">" ${Name}=None"</span><span class="sc">;</span> | 
|  | 1687 1674           <span class="s">}</span> | 
|  | 1688 1675         <span class="s">}</span> | 
|  | 1689 1676         <span class="k">else</span> <span class="s">{</span> | 
|  | 1690 1677           <span class="i">$EdgePropertyString</span> .= <span class="q">" ${Name}=${Value}"</span><span class="sc">;</span> | 
|  | 1691 1678         <span class="s">}</span> | 
|  | 1692 1679       <span class="s">}</span> | 
|  | 1693 1680       <span class="i">$EdgePropertyString</span> .= <span class="q">">"</span><span class="sc">;</span> | 
|  | 1694 1681     <span class="s">}</span> | 
|  | 1695 1682   <span class="s">}</span> | 
|  | 1696 1683   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Count</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1697 1684     <span class="i">$EdgePropertyString</span> = <span class="q">"EdgeProperties: None"</span><span class="sc">;</span> | 
|  | 1698 1685   <span class="s">}</span> | 
|  | 1699 1686 | 
|  | 1700 1687   <span class="k">return</span> <span class="i">$EdgePropertyString</span><span class="sc">;</span> | 
|  | 1701 1688 <span class="s">}</span> | 
|  | 1702 1689 | 
|  | 1703 1690 <span class="c"># Is it a graph object?</span> | 
|  | 1704 <a name="_IsGraph-"></a>1691 <span class="k">sub </span><span class="m">_IsGraph</span> <span class="s">{</span> | 
|  | 1705 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> | 
|  | 1706 1693 | 
|  | 1707 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> && <span class="i">$Object</span><span class="i">->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> | 
|  | 1708 1695 <span class="s">}</span> | 
|  | 1709 1696 | 
|  | 1710 1697 <span class="c"># Copy graph and its associated data using Storable::dclone and return a new graph...</span> | 
|  | 1711 1698 <span class="c">#</span> | 
|  | 1712 <a name="Copy-"></a>1699 <span class="k">sub </span><span class="m">Copy</span> <span class="s">{</span> | 
|  | 1713 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> | 
|  | 1714 1701   <span class="k">my</span><span class="s">(</span><span class="i">$NewGraph</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1715 1702 | 
|  | 1716 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> | 
|  | 1717 1704 | 
|  | 1718 1705   <span class="k">return</span> <span class="i">$NewGraph</span><span class="sc">;</span> | 
|  | 1719 1706 <span class="s">}</span> | 
|  | 1720 1707 | 
|  | 1721 1708 <span class="c"># Copy vertrices and edges from This graph to NewGraph specified...</span> | 
|  | 1722 1709 <span class="c">#</span> | 
|  | 1723 <a name="CopyVerticesAndEdges-"></a>1710 <span class="k">sub </span><span class="m">CopyVerticesAndEdges</span> <span class="s">{</span> | 
|  | 1724 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> | 
|  | 1725 1712 | 
|  | 1726 1713   <span class="c"># Copy vertices and edges...</span> | 
|  | 1727 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> | 
|  | 1728 1715   <span class="i">@Vertices</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1729 1716   <span class="k">if</span> <span class="s">(</span><span class="i">@Vertices</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1730 1717     <span class="i">$NewGraph</span><span class="i">->AddVertices</span><span class="s">(</span><span class="i">@Vertices</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1731 1718   <span class="s">}</span> | 
|  | 1732 1719   <span class="i">@Edges</span> = <span class="i">$This</span><span class="i">->GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1733 1720   <span class="k">if</span> <span class="s">(</span><span class="i">@Edges</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1734 1721     <span class="i">$NewGraph</span><span class="i">->AddEdges</span><span class="s">(</span><span class="i">@Edges</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1735 1722   <span class="s">}</span> | 
|  | 1736 1723 | 
|  | 1737 1724   <span class="k">return</span> <span class="i">$NewGraph</span><span class="sc">;</span> | 
|  | 1738 1725 <span class="s">}</span> | 
|  | 1739 1726 | 
|  | 1740 1727 <span class="c"># Copy properties of vertices from This graph to NewGraph specified...</span> | 
|  | 1741 1728 <span class="c">#</span> | 
|  | 1742 <a name="CopyVerticesProperties-"></a>1729 <span class="k">sub </span><span class="m">CopyVerticesProperties</span> <span class="s">{</span> | 
|  | 1743 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> | 
|  | 1744 1731 | 
|  | 1745 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> | 
|  | 1746 1733   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1747 1734   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1748 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> | 
|  | 1749 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">->GetVertexProperties</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1750 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> | 
|  | 1751 1738       <span class="i">$NewGraph</span><span class="i">->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> | 
|  | 1752 1739     <span class="s">}</span> | 
|  | 1753 1740   <span class="s">}</span> | 
|  | 1754 1741   <span class="k">return</span> <span class="i">$NewGraph</span><span class="sc">;</span> | 
|  | 1755 1742 <span class="s">}</span> | 
|  | 1756 1743 | 
|  | 1757 1744 <span class="c"># Copy properties of edges from This graph to NewGraph specified...</span> | 
|  | 1758 1745 <span class="c">#</span> | 
|  | 1759 <a name="CopyEdgesProperties-"></a>1746 <span class="k">sub </span><span class="m">CopyEdgesProperties</span> <span class="s">{</span> | 
|  | 1760 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> | 
|  | 1761 1748 | 
|  | 1762 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> | 
|  | 1763 1750   <span class="i">@EdgesVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1764 1751   <span class="i">@EdgesVertexIDs</span> = <span class="i">$This</span><span class="i">->GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1765 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> < <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> | 
|  | 1766 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> | 
|  | 1767 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">->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> | 
|  | 1768 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> | 
|  | 1769 1756       <span class="i">$NewGraph</span><span class="i">->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> | 
|  | 1770 1757     <span class="s">}</span> | 
|  | 1771 1758   <span class="s">}</span> | 
|  | 1772 1759   <span class="k">return</span> <span class="i">$NewGraph</span><span class="sc">;</span> | 
|  | 1773 1760 <span class="s">}</span> | 
|  | 1774 1761 | 
|  | 1775 1762 <span class="c"># Detect cycles and associate 'em to graph as graph property...</span> | 
|  | 1776 1763 <span class="c">#</span> | 
|  | 1777 1764 <span class="c"># Note:</span> | 
|  | 1778 1765 <span class="c">#   . CyclesDetection class detects all cycles in the graph and filters 'em to find</span> | 
|  | 1779 1766 <span class="c">#     independent cycles.</span> | 
|  | 1780 1767 <span class="c">#   . All cycles related methods in the graph operate on active cyclic paths. By default,</span> | 
|  | 1781 1768 <span class="c">#     active cyclic paths correspond to independent cycles. This behavior can be changed</span> | 
|  | 1782 1769 <span class="c">#     using SetActiveCyclicPaths method.</span> | 
|  | 1783 1770 <span class="c">#   . For topologically complex graphs containing large number of cycles, DetectCycles method</span> | 
|  | 1784 1771 <span class="c">#     implemented in CyclesDetection can time out in which case no cycles are detected or</span> | 
|  | 1785 1772 <span class="c">#     assigned.</span> | 
|  | 1786 1773 <span class="c">#</span> | 
|  | 1787 <a name="DetectCycles-"></a>1774 <span class="k">sub </span><span class="m">DetectCycles</span> <span class="s">{</span> | 
|  | 1788 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> | 
|  | 1789 1776   <span class="k">my</span><span class="s">(</span><span class="i">$CyclesDetection</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1790 1777 | 
|  | 1791 1778   <span class="c"># Delete existing graph cycles...</span> | 
|  | 1792 1779   <span class="i">$This</span><span class="i">->_DeleteCyclesAssociatedWithGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1793 1780 | 
|  | 1794 1781   <span class="c"># Detect cycles...</span> | 
|  | 1795 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> | 
|  | 1796 1783   <span class="k">if</span> <span class="s">(</span>!<span class="i">$CyclesDetection</span><span class="i">->DetectCycles</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1797 1784     <span class="c"># Cycles detection didn't finish...</span> | 
|  | 1798 1785     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1799 1786   <span class="s">}</span> | 
|  | 1800 1787 | 
|  | 1801 1788   <span class="c"># Get cycles and associate 'em to graph as properties...</span> | 
|  | 1802 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> | 
|  | 1803 1790   <span class="i">@AllCyclicPaths</span> = <span class="i">$CyclesDetection</span><span class="i">->GetAllCyclicPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1804 1791   <span class="i">@IndependentCyclicPaths</span> = <span class="i">$CyclesDetection</span><span class="i">->GetIndependentCyclicPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1805 1792 | 
|  | 1806 1793   <span class="i">$This</span><span class="i">->SetGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="cm">,</span> \<span class="i">@IndependentCyclicPaths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1807 1794   <span class="i">$This</span><span class="i">->SetGraphProperty</span><span class="s">(</span><span class="q">'AllCyclicPaths'</span><span class="cm">,</span> \<span class="i">@AllCyclicPaths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1808 1795   <span class="i">$This</span><span class="i">->SetGraphProperty</span><span class="s">(</span><span class="q">'IndependentCyclicPaths'</span><span class="cm">,</span> \<span class="i">@IndependentCyclicPaths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1809 1796 | 
|  | 1810 1797   <span class="c"># Map cycles information to vertices and edges; identify fused cycles as well...</span> | 
|  | 1811 1798   <span class="k">return</span> <span class="i">$This</span><span class="i">->_ProcessDetectedCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1812 1799 <span class="s">}</span> | 
|  | 1813 1800 | 
|  | 1814 1801 <span class="c"># Delete any cycle properties assigned to graph, vertices and edges during detect cycles operation...</span> | 
|  | 1815 1802 <span class="c">#</span> | 
|  | 1816 <a name="ClearCycles-"></a>1803 <span class="k">sub </span><span class="m">ClearCycles</span> <span class="s">{</span> | 
|  | 1817 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> | 
|  | 1818 1805 | 
|  | 1819 1806   <span class="c"># Delete cycle properties associated with graph...</span> | 
|  | 1820 1807   <span class="i">$This</span><span class="i">->_DeleteCyclesAssociatedWithGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1821 1808   <span class="i">$This</span><span class="i">->_DeleteFusedCyclesAssociatedWithGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1822 1809 | 
|  | 1823 1810   <span class="c"># Delete cycle properties associated with vertices and edges...</span> | 
|  | 1824 1811   <span class="i">$This</span><span class="i">->_DeleteCyclesAssociatedWithVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1825 1812   <span class="i">$This</span><span class="i">->_DeleteCyclesAssociatedWithEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1826 1813 | 
|  | 1827 1814   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1828 1815 <span class="s">}</span> | 
|  | 1829 1816 | 
|  | 1830 1817 <span class="c"># Setup cyclic paths to use during all cycle related methods. Possible values:</span> | 
|  | 1831 1818 <span class="c"># Independent or All. Default is to use Independent cyclic paths.</span> | 
|  | 1832 1819 <span class="c">#</span> | 
|  | 1833 <a name="SetActiveCyclicPaths-"></a>1820 <span class="k">sub </span><span class="m">SetActiveCyclicPaths</span> <span class="s">{</span> | 
|  | 1834 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> | 
|  | 1835 1822 | 
|  | 1836 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> | 
|  | 1837 1824     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetActiveCyclicPaths: Didn't set active cyclic path: Cyclic path must be specified..."</span><span class="sc">;</span> | 
|  | 1838 1825     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1839 1826   <span class="s">}</span> | 
|  | 1840 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> | 
|  | 1841 1828     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetActiveCyclicPaths: Didn't set active cyclic path: Specified path type, $CyclicPathsType, is not valid. Supported valeus: Independent or All..."</span><span class="sc">;</span> | 
|  | 1842 1829     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1843 1830   <span class="s">}</span> | 
|  | 1844 1831   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1845 1832     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetActiveCyclicPaths: Didn't set active cyclic path: Cycles haven't been detected yet..."</span><span class="sc">;</span> | 
|  | 1846 1833     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 1847 1834   <span class="s">}</span> | 
|  | 1848 1835   <span class="i">$This</span><span class="i">->DeleteGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1849 1836 | 
|  | 1850 1837   <span class="k">my</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1851 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> | 
|  | 1852 1839     <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">->GetGraphProperty</span><span class="s">(</span><span class="q">'IndependentCyclicPaths'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1853 1840   <span class="s">}</span> | 
|  | 1854 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> | 
|  | 1855 1842     <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">->GetGraphProperty</span><span class="s">(</span><span class="q">'AllCyclicPaths'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1856 1843   <span class="s">}</span> | 
|  | 1857 1844   <span class="i">$This</span><span class="i">->SetGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="cm">,</span> <span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1858 1845 | 
|  | 1859 1846   <span class="c"># Map cycles information to vertices and edges; identify fused cycles as well...</span> | 
|  | 1860 1847   <span class="i">$This</span><span class="i">->_ProcessDetectedCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1861 1848 | 
|  | 1862 1849   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1863 1850 <span class="s">}</span> | 
|  | 1864 1851 | 
|  | 1865 1852 <span class="c"># Assign cycles information on to vertices and edges as vertex edge properties properties;</span> | 
|  | 1866 1853 <span class="c"># identify fused cycles as well...</span> | 
|  | 1867 1854 <span class="c">#</span> | 
|  | 1868 <a name="_ProcessDetectedCycles-"></a>1855 <span class="k">sub </span><span class="m">_ProcessDetectedCycles</span> <span class="s">{</span> | 
|  | 1869 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> | 
|  | 1870 1857 | 
|  | 1871 1858   <span class="i">$This</span><span class="i">->_AssociateCyclesWithVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1872 1859   <span class="i">$This</span><span class="i">->_AssociateCyclesWithEdgesAndIdentifyFusedCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1873 1860 | 
|  | 1874 1861   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1875 1862 <span class="s">}</span> | 
|  | 1876 1863 | 
|  | 1877 1864 <span class="c"># Associate cycles information to vertices as vertex properties...</span> | 
|  | 1878 1865 <span class="c">#</span> | 
|  | 1879 <a name="_AssociateCyclesWithVertices-"></a>1866 <span class="k">sub </span><span class="m">_AssociateCyclesWithVertices</span> <span class="s">{</span> | 
|  | 1880 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> | 
|  | 1881 1868 | 
|  | 1882 1869   <span class="c"># Clear up any exisiting properties...</span> | 
|  | 1883 1870   <span class="i">$This</span><span class="i">->_DeleteCyclesAssociatedWithVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1884 1871 | 
|  | 1885 1872   <span class="c"># Collects CyclicPaths for each vertex...</span> | 
|  | 1886 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> | 
|  | 1887 1874 | 
|  | 1888 1875   <span class="i">%VertexIDToCylicPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1889 1876   <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">->GetGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1890 1877 | 
|  | 1891 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> | 
|  | 1892 1879     <span class="c"># No cycles out there...</span> | 
|  | 1893 1880     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1894 1881   <span class="s">}</span> | 
|  | 1895 1882 | 
|  | 1896 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> | 
|  | 1897 1884     <span class="i">@CyclicPathVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1898 1885     <span class="i">@CyclicPathVertexIDs</span> = <span class="i">$ActiveCyclicPath</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1899 1886     <span class="c"># Take out end vertex: It's same as start vertex for cyclic path...</span> | 
|  | 1900 1887     <span class="k">pop</span> <span class="i">@CyclicPathVertexIDs</span><span class="sc">;</span> | 
|  | 1901 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> | 
|  | 1902 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> | 
|  | 1903 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> | 
|  | 1904 1891       <span class="s">}</span> | 
|  | 1905 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> | 
|  | 1906 1893     <span class="s">}</span> | 
|  | 1907 1894   <span class="s">}</span> | 
|  | 1908 1895 | 
|  | 1909 1896   <span class="c"># Associate CyclicPaths to vertices...</span> | 
|  | 1910 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> | 
|  | 1911 1898     <span class="i">$This</span><span class="i">->SetVertexProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 1912 1899   <span class="s">}</span> | 
|  | 1913 1900   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1914 1901 <span class="s">}</span> | 
|  | 1915 1902 | 
|  | 1916 1903 <span class="c"># Associate cycles information to edges as edge properties and identify fused</span> | 
|  | 1917 1904 <span class="c"># cycles...</span> | 
|  | 1918 1905 <span class="c">#</span> | 
|  | 1919 <a name="_AssociateCyclesWithEdgesAndIdentifyFusedCycles-"></a>1906 <span class="k">sub </span><span class="m">_AssociateCyclesWithEdgesAndIdentifyFusedCycles</span> <span class="s">{</span> | 
|  | 1920 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> | 
|  | 1921 1908 | 
|  | 1922 1909   <span class="c"># Delete existing cycles...</span> | 
|  | 1923 1910   <span class="i">$This</span><span class="i">->_DeleteCyclesAssociatedWithEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1924 1911   <span class="i">$This</span><span class="i">->_DeleteFusedCyclesAssociatedWithGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1925 1912 | 
|  | 1926 1913   <span class="c"># Collect cyclic paths for each edge...</span> | 
|  | 1927 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> | 
|  | 1928 1915 | 
|  | 1929 1916   <span class="i">%EdgeIDToCylicPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1930 1917   <span class="i">$EdgeIDDelimiter</span> = <span class="q">"~"</span><span class="sc">;</span> | 
|  | 1931 1918   <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">->GetGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1932 1919 | 
|  | 1933 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> | 
|  | 1934 1921     <span class="c"># No cycles out there...</span> | 
|  | 1935 1922     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1936 1923   <span class="s">}</span> | 
|  | 1937 1924 | 
|  | 1938 1925   <span class="i">$CyclesWithCommonEdgesPresent</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1939 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> | 
|  | 1940 1927     <span class="i">@CyclicPathEdgeVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1941 1928     <span class="i">@CyclicPathEdgeVertexIDs</span> = <span class="i">$ActiveCyclicPath</span><span class="i">->GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1942 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> < <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> | 
|  | 1943 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> | 
|  | 1944 1931       <span class="i">$EdgeID</span> = <span class="s">(</span><span class="i">$VertexID1</span> < <span class="i">$VertexID2</span><span class="s">)</span> ? <span class="q">"${VertexID1}${EdgeIDDelimiter}${VertexID2}"</span> <span class="co">:</span> <span class="q">"${VertexID2}${EdgeIDDelimiter}${VertexID1}"</span><span class="sc">;</span> | 
|  | 1945 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> | 
|  | 1946 1933         <span class="c"># A common edge between two cycles indicates a potential fused cycle...</span> | 
|  | 1947 1934         <span class="i">$CyclesWithCommonEdgesPresent</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 1948 1935       <span class="s">}</span> | 
|  | 1949 1936       <span class="k">else</span> <span class="s">{</span> | 
|  | 1950 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> | 
|  | 1951 1938       <span class="s">}</span> | 
|  | 1952 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> | 
|  | 1953 1940     <span class="s">}</span> | 
|  | 1954 1941   <span class="s">}</span> | 
|  | 1955 1942 | 
|  | 1956 1943   <span class="c"># Associate CyclicPaths with edges...</span> | 
|  | 1957 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> | 
|  | 1958 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> | 
|  | 1959 1946     <span class="i">$This</span><span class="i">->SetEdgeProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 1960 1947   <span class="s">}</span> | 
|  | 1961 1948 | 
|  | 1962 1949   <span class="k">if</span> <span class="s">(</span><span class="i">$CyclesWithCommonEdgesPresent</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1963 1950     <span class="c"># Identify fused cycles...</span> | 
|  | 1964 1951     <span class="i">$This</span><span class="i">->_IdentifyAndAssociateFusedCyclesWithGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1965 1952   <span class="s">}</span> | 
|  | 1966 1953 | 
|  | 1967 1954   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1968 1955 <span class="s">}</span> | 
|  | 1969 1956 | 
|  | 1970 1957 <span class="c"># Identify fused cycles and associate them to graph as graph property after cycles</span> | 
|  | 1971 1958 <span class="c"># have been associated with edges...</span> | 
|  | 1972 1959 <span class="c">#</span> | 
|  | 1973 1960 <span class="c"># Note:</span> | 
|  | 1974 1961 <span class="c">#   . During aromaticity detection, fused cycles are treated as one set for counting</span> | 
|  | 1975 1962 <span class="c">#     number of available pi electrons to check against Huckel's rule.</span> | 
|  | 1976 1963 <span class="c">#   . Fused cylce sets contain cycles with at least one common edge between pair</span> | 
|  | 1977 1964 <span class="c">#     of cycles. A specific pair of cycles might not have a direct common edge, but</span> | 
|  | 1978 1965 <span class="c">#     ends up in the same set due to a common edge with another cycle.</span> | 
|  | 1979 1966 <span class="c">#   . Fused cycles are attached to graph as 'FusedActiveCyclicPaths' property with</span> | 
|  | 1980 1967 <span class="c">#     its value as a reference to list of reference where each refernece corresponds</span> | 
|  | 1981 1968 <span class="c">#     to a list of cyclic path objects in a fused set.</span> | 
|  | 1982 1969 <span class="c">#   . For graphs containing fused cycles, non-fused cycles are separeted from fused</span> | 
|  | 1983 1970 <span class="c">#     cycles and attached to the graph as 'NonFusedActiveCyclicPaths'. It's a reference</span> | 
|  | 1984 1971 <span class="c">#     to list containing cylic path objects.</span> | 
|  | 1985 1972 <span class="c">#</span> | 
|  | 1986 <a name="_IdentifyAndAssociateFusedCyclesWithGraph-"></a>1973 <span class="k">sub </span><span class="m">_IdentifyAndAssociateFusedCyclesWithGraph</span> <span class="s">{</span> | 
|  | 1987 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> | 
|  | 1988 1975 | 
|  | 1989 1976   <span class="c"># Delete exisiting fused and non-fused cycles...</span> | 
|  | 1990 1977   <span class="i">$This</span><span class="i">->_DeleteFusedCyclesAssociatedWithGraph</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1991 1978 | 
|  | 1992 1979   <span class="k">my</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1993 1980   <span class="i">$ActiveCyclicPathsRef</span> = <span class="i">$This</span><span class="i">->GetGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1994 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> | 
|  | 1995 1982     <span class="c"># No cycles out there...</span> | 
|  | 1996 1983     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1997 1984   <span class="s">}</span> | 
|  | 1998 1985 | 
|  | 1999 1986   <span class="c"># Get fused cycle pairs...</span> | 
|  | 2000 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> | 
|  | 2001 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">->_GetFusedCyclePairs</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2002 1989 | 
|  | 2003 1990   <span class="c"># Get fused cycle set indices...</span> | 
|  | 2004 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> | 
|  | 2005 1992   <span class="i">$FusedCycleSetsIndicesRef</span> = <span class="i">$This</span><span class="i">->_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> | 
|  | 2006 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> | 
|  | 2007 1994     <span class="c"># No fused cycles out there...</span> | 
|  | 2008 1995     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 2009 1996   <span class="s">}</span> | 
|  | 2010 1997 | 
|  | 2011 1998   <span class="c"># Get fused and non-fused cycles...</span> | 
|  | 2012 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> | 
|  | 2013 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">->_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> | 
|  | 2014 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> | 
|  | 2015 2002     <span class="c"># No fused cycles out there...</span> | 
|  | 2016 2003     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 2017 2004   <span class="s">}</span> | 
|  | 2018 2005 | 
|  | 2019 2006   <span class="c"># Associate fused and non fused cycles to graph....</span> | 
|  | 2020 2007   <span class="i">$This</span><span class="i">->SetGraphProperty</span><span class="s">(</span><span class="q">'FusedActiveCyclicPaths'</span><span class="cm">,</span> <span class="i">$FusedCycleSetsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2021 2008   <span class="i">$This</span><span class="i">->SetGraphProperty</span><span class="s">(</span><span class="q">'NonFusedActiveCyclicPaths'</span><span class="cm">,</span> <span class="i">$NonFusedCyclesRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2022 2009 | 
|  | 2023 2010   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 2024 2011 <span class="s">}</span> | 
|  | 2025 2012 | 
|  | 2026 2013 <span class="c"># Collect fused cycle pairs...</span> | 
|  | 2027 2014 <span class="c">#</span> | 
|  | 2028 <a name="_GetFusedCyclePairs-"></a>2015 <span class="k">sub </span><span class="m">_GetFusedCyclePairs</span> <span class="s">{</span> | 
|  | 2029 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> | 
|  | 2030 2017 | 
|  | 2031 2018   <span class="c"># Setup a CyclicPathID to CyclicPathIndex map...</span> | 
|  | 2032 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> | 
|  | 2033 2020 | 
|  | 2034 2021   <span class="i">%CyclicPathIDToIndex</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2035 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> | 
|  | 2036 2023     <span class="i">$ActiveCyclicPath</span> = <span class="i">$ActiveCyclicPathsRef</span>->[<span class="i">$CyclicPathIndex</span>]<span class="sc">;</span> | 
|  | 2037 2024     <span class="i">$CyclicPathID</span> = <span class="q">"$ActiveCyclicPath"</span><span class="sc">;</span> | 
|  | 2038 2025     <span class="i">$CyclicPathIDToIndex</span>{<span class="i">$CyclicPathID</span>} = <span class="i">$CyclicPathIndex</span><span class="sc">;</span> | 
|  | 2039 2026   <span class="s">}</span> | 
|  | 2040 2027   <span class="c"># Go over cycle edges and collect fused cycle pairs...</span> | 
|  | 2041 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> | 
|  | 2042 2029 | 
|  | 2043 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> | 
|  | 2044 2031   <span class="i">%CommonEdgesCount</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2045 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> | 
|  | 2046 2033 | 
|  | 2047 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> | 
|  | 2048 2035     <span class="i">@CyclicPathEdgeVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2049 2036     <span class="i">@CyclicPathEdgeVertexIDs</span> = <span class="i">$ActiveCyclicPath</span><span class="i">->GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2050 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> < <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> | 
|  | 2051 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> | 
|  | 2052 2039       <span class="i">$EdgeCyclicPathsRef</span> = <span class="i">$This</span><span class="i">->GetEdgeProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2053 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> | 
|  | 2054 2041         <span class="c"># Not considered a fused edge...</span> | 
|  | 2055 2042         <span class="k">next</span> <span class="j">EDGE</span><span class="sc">;</span> | 
|  | 2056 2043       <span class="s">}</span> | 
|  | 2057 2044       <span class="c"># Set up a fused cycle pair...</span> | 
|  | 2058 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> | 
|  | 2059 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">"${FusedCyclicPath1}"</span><span class="cm">,</span> <span class="q">"${FusedCyclicPath2}"</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2060 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> | 
|  | 2061 2048       <span class="i">$FusedCyclePairID</span> = <span class="s">(</span><span class="i">$FusedCyclicPathIndex1</span> < <span class="i">$FusedCyclicPathIndex2</span><span class="s">)</span> ? <span class="q">"${FusedCyclicPathIndex1}-${FusedCyclicPathIndex2}"</span> <span class="co">:</span> <span class="q">"${FusedCyclicPathIndex2}-${FusedCyclicPathIndex1}"</span><span class="sc">;</span> | 
|  | 2062 2049       <span class="i">$EdgeID</span> = <span class="s">(</span><span class="i">$VertexID1</span> < <span class="i">$VertexID2</span><span class="s">)</span> ? <span class="q">"${VertexID1}-${VertexID2}"</span> <span class="co">:</span> <span class="q">"${VertexID2}-${VertexID1}"</span><span class="sc">;</span> | 
|  | 2063 2050 | 
|  | 2064 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> | 
|  | 2065 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> | 
|  | 2066 2053           <span class="c"># Edge already processed...</span> | 
|  | 2067 2054           <span class="k">next</span> <span class="j">EDGE</span><span class="sc">;</span> | 
|  | 2068 2055         <span class="s">}</span> | 
|  | 2069 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> | 
|  | 2070 2057 | 
|  | 2071 2058         <span class="i">$CommonEdgesCount</span>{<span class="i">$FusedCyclePairID</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 2072 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> | 
|  | 2073 2060       <span class="s">}</span> | 
|  | 2074 2061       <span class="k">else</span> <span class="s">{</span> | 
|  | 2075 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> | 
|  | 2076 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> | 
|  | 2077 2064 | 
|  | 2078 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> | 
|  | 2079 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> | 
|  | 2080 2067 | 
|  | 2081 2068         <span class="i">$CommonEdgesCount</span>{<span class="i">$FusedCyclePairID</span>} = <span class="n">1</span><span class="sc">;</span> | 
|  | 2082 2069       <span class="s">}</span> | 
|  | 2083 2070     <span class="s">}</span> | 
|  | 2084 2071   <span class="s">}</span> | 
|  | 2085 2072   <span class="c"># Valid fused cyle in fused cycle pairs must have only one common egde...</span> | 
|  | 2086 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> | 
|  | 2087 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> | 
|  | 2088 2075     <span class="i">$FusedCycles</span>{<span class="i">$FusedCyclicPathIndex1</span>} = <span class="i">$FusedCyclicPathIndex1</span><span class="sc">;</span> | 
|  | 2089 2076     <span class="i">$FusedCycles</span>{<span class="i">$FusedCyclicPathIndex2</span>} = <span class="i">$FusedCyclicPathIndex2</span><span class="sc">;</span> | 
|  | 2090 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> | 
|  | 2091 2078       <span class="c"># Mark the cycles involved as invalid fused cycles...</span> | 
|  | 2092 2079       <span class="i">$InValidFusedCycles</span>{<span class="i">$FusedCyclicPathIndex1</span>} = <span class="i">$FusedCyclicPathIndex1</span><span class="sc">;</span> | 
|  | 2093 2080       <span class="i">$InValidFusedCycles</span>{<span class="i">$FusedCyclicPathIndex2</span>} = <span class="i">$FusedCyclicPathIndex2</span><span class="sc">;</span> | 
|  | 2094 2081     <span class="s">}</span> | 
|  | 2095 2082   <span class="s">}</span> | 
|  | 2096 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> | 
|  | 2097 2084 <span class="s">}</span> | 
|  | 2098 2085 | 
|  | 2099 2086 <span class="c"># Go over fused cycles and set up a graph to collect fused cycle sets. Graph vertices</span> | 
|  | 2100 2087 <span class="c"># correspond to cylce indices; edges correspond to pair of fused cylcles; fused cycle</span> | 
|  | 2101 2088 <span class="c"># sets correspond to connected components. Addionally set up common edges for</span> | 
|  | 2102 2089 <span class="c"># fused cycle sets.</span> | 
|  | 2103 2090 <span class="c">#</span> | 
|  | 2104 <a name="_GetFusedCycleSetsIndices-"></a>2091 <span class="k">sub </span><span class="m">_GetFusedCycleSetsIndices</span> <span class="s">{</span> | 
|  | 2105 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> | 
|  | 2106 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> | 
|  | 2107 2094 | 
|  | 2108 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> | 
|  | 2109 2096   <span class="i">@FusedCycleSetsIndices</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2110 2097 | 
|  | 2111 2098   <span class="i">@FusedCycleIndices</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> <=> <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> | 
|  | 2112 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> | 
|  | 2113 2100   <span class="k">if</span> <span class="s">(</span>!<span class="i">@FusedCycleIndices</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2114 2101     <span class="c"># No fused cycles out there...</span> | 
|  | 2115 2102     <span class="k">return</span> \<span class="i">@FusedCycleSetsIndices</span><span class="sc">;</span> | 
|  | 2116 2103   <span class="s">}</span> | 
|  | 2117 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> | 
|  | 2118 2105   <span class="i">$FusedCyclesGraph</span><span class="i">->AddEdges</span><span class="s">(</span><span class="i">@FusedCyclePairIndices</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2119 2106 | 
|  | 2120 2107   <span class="i">@FusedCycleSetsIndices</span> = <span class="i">$FusedCyclesGraph</span><span class="i">->GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2121 2108 | 
|  | 2122 2109   <span class="k">return</span> \<span class="i">@FusedCycleSetsIndices</span><span class="sc">;</span> | 
|  | 2123 2110 <span class="s">}</span> | 
|  | 2124 2111 | 
|  | 2125 2112 <span class="c"># Go over indices of fused cycle sets and map cyclic path indices to cyclic path objects.</span> | 
|  | 2126 2113 <span class="c"># For fused sets containing a cycle with more than one common edge, the whole set is treated</span> | 
|  | 2127 2114 <span class="c"># as non-fused set...</span> | 
|  | 2128 2115 <span class="c">#</span> | 
|  | 2129 <a name="_GetFusedAndNonFusedCycles-"></a>2116 <span class="k">sub </span><span class="m">_GetFusedAndNonFusedCycles</span> <span class="s">{</span> | 
|  | 2130 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> | 
|  | 2131 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> | 
|  | 2132 2119 | 
|  | 2133 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> | 
|  | 2134 2121   <span class="i">%CycleIndexVisited</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2135 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> | 
|  | 2136 2123     <span class="c"># Is it a valid fused cycle set? Fused cycle set containing any cycle with more than one common</span> | 
|  | 2137 2124     <span class="c"># edge is considered invalid and all its cycles are treated as non-fused cycles.</span> | 
|  | 2138 2125     <span class="i">$ValidFusedCycleSet</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 2139 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> | 
|  | 2140 2127       <span class="i">$CycleIndexVisited</span>{<span class="i">$CyclicPathIndex</span>} = <span class="i">$CyclicPathIndex</span><span class="sc">;</span> | 
|  | 2141 2128       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$InValidFusedCycleRef</span>->{<span class="i">$CyclicPathIndex</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 2142 2129         <span class="i">$ValidFusedCycleSet</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2143 2130       <span class="s">}</span> | 
|  | 2144 2131     <span class="s">}</span> | 
|  | 2145 2132     <span class="k">if</span> <span class="s">(</span><span class="i">$ValidFusedCycleSet</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2146 2133       <span class="k">my</span><span class="s">(</span><span class="i">@FusedCycleSet</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2147 2134       <span class="i">@FusedCycleSet</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2148 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">->GetLength</span><span class="s">(</span><span class="s">)</span> <=> <span class="i">$b</span><span class="i">->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>->[<span class="i">$_</span>] <span class="s">}</span> <span class="i">@</span>{<span class="i">$CycleSetIndicesRef</span>}<span class="sc">;</span> | 
|  | 2149 2136       <span class="k">push</span> <span class="i">@FusedCycleSets</span><span class="cm">,</span> \<span class="i">@FusedCycleSet</span><span class="sc">;</span> | 
|  | 2150 2137     <span class="s">}</span> | 
|  | 2151 2138     <span class="k">else</span> <span class="s">{</span> | 
|  | 2152 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>->[<span class="i">$_</span>] <span class="s">}</span> <span class="i">@</span>{<span class="i">$CycleSetIndicesRef</span>}<span class="sc">;</span> | 
|  | 2153 2140     <span class="s">}</span> | 
|  | 2154 2141   <span class="s">}</span> | 
|  | 2155 2142 | 
|  | 2156 2143   <span class="c"># Add any leftover cycles to non-fused cycles list...</span> | 
|  | 2157 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> | 
|  | 2158 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> | 
|  | 2159 2146       <span class="k">next</span> <span class="j">CYCLICPATH</span><span class="sc">;</span> | 
|  | 2160 2147     <span class="s">}</span> | 
|  | 2161 2148     <span class="k">push</span> <span class="i">@UnsortedNonFusedCycles</span><span class="cm">,</span> <span class="i">$ActiveCyclicPathsRef</span>->[<span class="i">$CyclicPathIndex</span>]<span class="sc">;</span> | 
|  | 2162 2149   <span class="s">}</span> | 
|  | 2163 2150   <span class="i">@NonFusedCycles</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span><span class="i">->GetLength</span><span class="s">(</span><span class="s">)</span> <=> <span class="i">$b</span><span class="i">->GetLength</span><span class="s">(</span><span class="s">)</span> <span class="s">}</span> <span class="i">@UnsortedNonFusedCycles</span><span class="sc">;</span> | 
|  | 2164 2151 | 
|  | 2165 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> | 
|  | 2166 2153 <span class="s">}</span> | 
|  | 2167 2154 | 
|  | 2168 2155 <span class="c"># Delete cycles associated with graph...</span> | 
|  | 2169 2156 <span class="c">#</span> | 
|  | 2170 <a name="_DeleteCyclesAssociatedWithGraph-"></a>2157 <span class="k">sub </span><span class="m">_DeleteCyclesAssociatedWithGraph</span> <span class="s">{</span> | 
|  | 2171 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> | 
|  | 2172 2159 | 
|  | 2173 2160   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2174 2161     <span class="i">$This</span><span class="i">->DeleteGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2175 2162     <span class="i">$This</span><span class="i">->DeleteGraphProperty</span><span class="s">(</span><span class="q">'AllCyclicPaths'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2176 2163     <span class="i">$This</span><span class="i">->DeleteGraphProperty</span><span class="s">(</span><span class="q">'IndependentCyclicPaths'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2177 2164   <span class="s">}</span> | 
|  | 2178 2165   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 2179 2166 <span class="s">}</span> | 
|  | 2180 2167 | 
|  | 2181 2168 <span class="c"># Delete cycles associated with vertices...</span> | 
|  | 2182 2169 <span class="c">#</span> | 
|  | 2183 <a name="_DeleteCyclesAssociatedWithVertices-"></a>2170 <span class="k">sub </span><span class="m">_DeleteCyclesAssociatedWithVertices</span> <span class="s">{</span> | 
|  | 2184 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> | 
|  | 2185 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> | 
|  | 2186 2173 | 
|  | 2187 2174   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2188 2175   <span class="i">@VertexIDs</span> = <span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2189 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> | 
|  | 2190 2177     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasVertexProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2191 2178       <span class="i">$This</span><span class="i">->DeleteVertexProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2192 2179     <span class="s">}</span> | 
|  | 2193 2180   <span class="s">}</span> | 
|  | 2194 2181   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 2195 2182 <span class="s">}</span> | 
|  | 2196 2183 | 
|  | 2197 2184 <span class="c"># Delete cycles associated with edges...</span> | 
|  | 2198 2185 <span class="c">#</span> | 
|  | 2199 <a name="_DeleteCyclesAssociatedWithEdges-"></a>2186 <span class="k">sub </span><span class="m">_DeleteCyclesAssociatedWithEdges</span> <span class="s">{</span> | 
|  | 2200 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> | 
|  | 2201 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> | 
|  | 2202 2189 | 
|  | 2203 2190   <span class="i">@EdgeVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2204 2191   <span class="i">@EdgeVertexIDs</span> = <span class="i">$This</span><span class="i">->GetEdges</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2205 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> < <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> | 
|  | 2206 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> | 
|  | 2207 2194     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasEdgeProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2208 2195       <span class="i">$This</span><span class="i">->DeleteEdgeProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2209 2196     <span class="s">}</span> | 
|  | 2210 2197   <span class="s">}</span> | 
|  | 2211 2198   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 2212 2199 <span class="s">}</span> | 
|  | 2213 2200 | 
|  | 2214 2201 <span class="c"># Delete fused cycles associated with edges...</span> | 
|  | 2215 2202 <span class="c">#</span> | 
|  | 2216 <a name="_DeleteFusedCyclesAssociatedWithGraph-"></a>2203 <span class="k">sub </span><span class="m">_DeleteFusedCyclesAssociatedWithGraph</span> <span class="s">{</span> | 
|  | 2217 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> | 
|  | 2218 2205 | 
|  | 2219 2206   <span class="c"># Delete exisiting cycles...</span> | 
|  | 2220 2207   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasGraphProperty</span><span class="s">(</span><span class="q">'FusedActiveCyclicPaths'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2221 2208     <span class="i">$This</span><span class="i">->DeleteGraphProperty</span><span class="s">(</span><span class="q">'FusedActiveCyclicPaths'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2222 2209     <span class="i">$This</span><span class="i">->DeleteGraphProperty</span><span class="s">(</span><span class="q">'NonFusedActiveCyclicPaths'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2223 2210   <span class="s">}</span> | 
|  | 2224 2211   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 2225 2212 <span class="s">}</span> | 
|  | 2226 2213 | 
|  | 2227 2214 <span class="c"># Does graph contains any cycles?</span> | 
|  | 2228 2215 <span class="c">#</span> | 
|  | 2229 <a name="IsAcyclic-"></a>2216 <span class="k">sub </span><span class="m">IsAcyclic</span> <span class="s">{</span> | 
|  | 2230 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> | 
|  | 2231 2218 | 
|  | 2232 2219   <span class="k">return</span> <span class="i">$This</span><span class="i">->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> | 
|  | 2233 2220 <span class="s">}</span> | 
|  | 2234 2221 | 
|  | 2235 2222 <span class="c"># Does graph contains cycles?</span> | 
|  | 2236 2223 <span class="c">#</span> | 
|  | 2237 <a name="IsCyclic-"></a>2224 <span class="k">sub </span><span class="m">IsCyclic</span> <span class="s">{</span> | 
|  | 2238 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> | 
|  | 2239 2226 | 
|  | 2240 2227   <span class="k">return</span> <span class="i">$This</span><span class="i">->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> | 
|  | 2241 2228 <span class="s">}</span> | 
|  | 2242 2229 | 
|  | 2243 2230 <span class="c"># Does graph contains only any cycle?</span> | 
|  | 2244 2231 <span class="c">#</span> | 
|  | 2245 <a name="IsUnicyclic-"></a>2232 <span class="k">sub </span><span class="m">IsUnicyclic</span> <span class="s">{</span> | 
|  | 2246 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> | 
|  | 2247 2234 | 
|  | 2248 2235   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->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> | 
|  | 2249 2236 <span class="s">}</span> | 
|  | 2250 2237 | 
|  | 2251 2238 <span class="c"># Get size of smallest cycle in graph...</span> | 
|  | 2252 2239 <span class="c">#</span> | 
|  | 2253 <a name="GetGirth-"></a>2240 <span class="k">sub </span><span class="m">GetGirth</span> <span class="s">{</span> | 
|  | 2254 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> | 
|  | 2255 2242 | 
|  | 2256 2243   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetSizeOfSmallestCycle</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2257 2244 <span class="s">}</span> | 
|  | 2258 2245 | 
|  | 2259 2246 <span class="c"># Get size of smallest cycle in graph...</span> | 
|  | 2260 2247 <span class="c">#</span> | 
|  | 2261 <a name="GetSizeOfSmallestCycle-"></a>2248 <span class="k">sub </span><span class="m">GetSizeOfSmallestCycle</span> <span class="s">{</span> | 
|  | 2262 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> | 
|  | 2263 2250 | 
|  | 2264 2251   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCycleSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'SmallestCycle'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2265 2252 <span class="s">}</span> | 
|  | 2266 2253 | 
|  | 2267 2254 <span class="c"># Get size of largest cycle in graph...</span> | 
|  | 2268 2255 <span class="c">#</span> | 
|  | 2269 <a name="GetCircumference-"></a>2256 <span class="k">sub </span><span class="m">GetCircumference</span> <span class="s">{</span> | 
|  | 2270 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> | 
|  | 2271 2258 | 
|  | 2272 2259   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetSizeOfLargestCycle</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2273 2260 <span class="s">}</span> | 
|  | 2274 2261 | 
|  | 2275 2262 <span class="c"># Get size of largest cycle in graph...</span> | 
|  | 2276 2263 <span class="c">#</span> | 
|  | 2277 <a name="GetSizeOfLargestCycle-"></a>2264 <span class="k">sub </span><span class="m">GetSizeOfLargestCycle</span> <span class="s">{</span> | 
|  | 2278 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> | 
|  | 2279 2266 | 
|  | 2280 2267   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCycleSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'LargestCycle'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2281 2268 <span class="s">}</span> | 
|  | 2282 2269 | 
|  | 2283 2270 <span class="c"># Get number of cycles in graph...</span> | 
|  | 2284 2271 <span class="c">#</span> | 
|  | 2285 <a name="GetNumOfCycles-"></a>2272 <span class="k">sub </span><span class="m">GetNumOfCycles</span> <span class="s">{</span> | 
|  | 2286 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> | 
|  | 2287 2274 | 
|  | 2288 2275   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'AllSizes'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2289 2276 <span class="s">}</span> | 
|  | 2290 2277 | 
|  | 2291 2278 <span class="c"># Get number of cycles with odd size in graph...</span> | 
|  | 2292 2279 <span class="c">#</span> | 
|  | 2293 <a name="GetNumOfCyclesWithOddSize-"></a>2280 <span class="k">sub </span><span class="m">GetNumOfCyclesWithOddSize</span> <span class="s">{</span> | 
|  | 2294 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> | 
|  | 2295 2282 | 
|  | 2296 2283   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'OddSize'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2297 2284 <span class="s">}</span> | 
|  | 2298 2285 | 
|  | 2299 2286 <span class="c"># Get number of cycles with even size in graph...</span> | 
|  | 2300 2287 <span class="c">#</span> | 
|  | 2301 <a name="GetNumOfCyclesWithEvenSize-"></a>2288 <span class="k">sub </span><span class="m">GetNumOfCyclesWithEvenSize</span> <span class="s">{</span> | 
|  | 2302 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> | 
|  | 2303 2290 | 
|  | 2304 2291   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'EvenSize'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2305 2292 <span class="s">}</span> | 
|  | 2306 2293 | 
|  | 2307 2294 <span class="c"># Get number of cycles with specific size in graph...</span> | 
|  | 2308 2295 <span class="c">#</span> | 
|  | 2309 <a name="GetNumOfCyclesWithSize-"></a>2296 <span class="k">sub </span><span class="m">GetNumOfCyclesWithSize</span> <span class="s">{</span> | 
|  | 2310 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> | 
|  | 2311 2298 | 
|  | 2312 2299   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'SpecifiedSize'</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2313 2300 <span class="s">}</span> | 
|  | 2314 2301 | 
|  | 2315 2302 <span class="c"># Get number of cycles with size less than a specific size in graph...</span> | 
|  | 2316 2303 <span class="c">#</span> | 
|  | 2317 <a name="GetNumOfCyclesWithSizeLessThan-"></a>2304 <span class="k">sub </span><span class="m">GetNumOfCyclesWithSizeLessThan</span> <span class="s">{</span> | 
|  | 2318 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> | 
|  | 2319 2306 | 
|  | 2320 2307   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'SizeLessThan'</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2321 2308 <span class="s">}</span> | 
|  | 2322 2309 | 
|  | 2323 2310 <span class="c"># Get number of cycles with size greater than a specific size in graph...</span> | 
|  | 2324 2311 <span class="c">#</span> | 
|  | 2325 <a name="GetNumOfCyclesWithSizeGreaterThan-"></a>2312 <span class="k">sub </span><span class="m">GetNumOfCyclesWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 2326 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> | 
|  | 2327 2314 | 
|  | 2328 2315   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'SizeGreaterThan'</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2329 2316 <span class="s">}</span> | 
|  | 2330 2317 | 
|  | 2331 2318 <span class="c"># Get largest cyclic path in graph...</span> | 
|  | 2332 2319 <span class="c">#</span> | 
|  | 2333 <a name="GetLargestCycle-"></a>2320 <span class="k">sub </span><span class="m">GetLargestCycle</span> <span class="s">{</span> | 
|  | 2334 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> | 
|  | 2335 2322 | 
|  | 2336 2323   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCycle</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'LargestCycle'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2337 2324 <span class="s">}</span> | 
|  | 2338 2325 | 
|  | 2339 2326 <span class="c"># Get smallest cyclic path in graph...</span> | 
|  | 2340 2327 <span class="c">#</span> | 
|  | 2341 <a name="GetSmallestCycle-"></a>2328 <span class="k">sub </span><span class="m">GetSmallestCycle</span> <span class="s">{</span> | 
|  | 2342 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> | 
|  | 2343 2330 | 
|  | 2344 2331   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCycle</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'SmallestCycle'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2345 2332 <span class="s">}</span> | 
|  | 2346 2333 | 
|  | 2347 2334 <span class="c"># Get all cycles in graph...</span> | 
|  | 2348 2335 <span class="c">#</span> | 
|  | 2349 <a name="GetCycles-"></a>2336 <span class="k">sub </span><span class="m">GetCycles</span> <span class="s">{</span> | 
|  | 2350 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> | 
|  | 2351 2338 | 
|  | 2352 2339   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'AllSizes'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2353 2340 <span class="s">}</span> | 
|  | 2354 2341 | 
|  | 2355 2342 <span class="c"># Get cycles with odd size in graph...</span> | 
|  | 2356 2343 <span class="c">#</span> | 
|  | 2357 <a name="GetCyclesWithOddSize-"></a>2344 <span class="k">sub </span><span class="m">GetCyclesWithOddSize</span> <span class="s">{</span> | 
|  | 2358 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> | 
|  | 2359 2346 | 
|  | 2360 2347   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'OddSize'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2361 2348 <span class="s">}</span> | 
|  | 2362 2349 | 
|  | 2363 2350 <span class="c"># Get cycles with even size in graph...</span> | 
|  | 2364 2351 <span class="c">#</span> | 
|  | 2365 <a name="GetCyclesWithEvenSize-"></a>2352 <span class="k">sub </span><span class="m">GetCyclesWithEvenSize</span> <span class="s">{</span> | 
|  | 2366 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> | 
|  | 2367 2354 | 
|  | 2368 2355   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'EvenSize'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2369 2356 <span class="s">}</span> | 
|  | 2370 2357 | 
|  | 2371 2358 <span class="c"># Get cycles with specific size in graph...</span> | 
|  | 2372 2359 <span class="c">#</span> | 
|  | 2373 <a name="GetCyclesWithSize-"></a>2360 <span class="k">sub </span><span class="m">GetCyclesWithSize</span> <span class="s">{</span> | 
|  | 2374 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> | 
|  | 2375 2362 | 
|  | 2376 2363   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'SpecifiedSize'</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2377 2364 <span class="s">}</span> | 
|  | 2378 2365 | 
|  | 2379 2366 <span class="c"># Get cycles with size less than a specific size in graph...</span> | 
|  | 2380 2367 <span class="c">#</span> | 
|  | 2381 <a name="GetCyclesWithSizeLessThan-"></a>2368 <span class="k">sub </span><span class="m">GetCyclesWithSizeLessThan</span> <span class="s">{</span> | 
|  | 2382 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> | 
|  | 2383 2370 | 
|  | 2384 2371   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'SizeLessThan'</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2385 2372 <span class="s">}</span> | 
|  | 2386 2373 | 
|  | 2387 2374 <span class="c"># Get cycles with size greater than a specific size in graph...</span> | 
|  | 2388 2375 <span class="c">#</span> | 
|  | 2389 <a name="GetCyclesWithSizeGreaterThan-"></a>2376 <span class="k">sub </span><span class="m">GetCyclesWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 2390 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> | 
|  | 2391 2378 | 
|  | 2392 2379   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'GraphCycle'</span><span class="cm">,</span> <span class="q">'SizeGreaterThan'</span><span class="cm">,</span> <span class="i">$CycleSize</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2393 2380 <span class="s">}</span> | 
|  | 2394 2381 | 
|  | 2395 2382 <span class="c"># Is vertex in a cycle?</span> | 
|  | 2396 2383 <span class="c">#</span> | 
|  | 2397 <a name="IsCyclicVertex-"></a>2384 <span class="k">sub </span><span class="m">IsCyclicVertex</span> <span class="s">{</span> | 
|  | 2398 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> | 
|  | 2399 2386 | 
|  | 2400 2387   <span class="k">return</span> <span class="i">$This</span><span class="i">->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> | 
|  | 2401 2388 <span class="s">}</span> | 
|  | 2402 2389 | 
|  | 2403 2390 <span class="c"># Is vertex in a only one cycle?</span> | 
|  | 2404 2391 <span class="c">#</span> | 
|  | 2405 <a name="IsUnicyclicVertex-"></a>2392 <span class="k">sub </span><span class="m">IsUnicyclicVertex</span> <span class="s">{</span> | 
|  | 2406 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> | 
|  | 2407 2394 | 
|  | 2408 2395   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->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> | 
|  | 2409 2396 <span class="s">}</span> | 
|  | 2410 2397 | 
|  | 2411 2398 <span class="c"># Is vertex not in a cycle?</span> | 
|  | 2412 2399 <span class="c">#</span> | 
|  | 2413 <a name="IsAcyclicVertex-"></a>2400 <span class="k">sub </span><span class="m">IsAcyclicVertex</span> <span class="s">{</span> | 
|  | 2414 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> | 
|  | 2415 2402 | 
|  | 2416 2403   <span class="k">return</span> <span class="i">$This</span><span class="i">->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> | 
|  | 2417 2404 <span class="s">}</span> | 
|  | 2418 2405 | 
|  | 2419 2406 <span class="c"># Get size of smallest cycle containing specified vertex...</span> | 
|  | 2420 2407 <span class="c">#</span> | 
|  | 2421 <a name="GetSizeOfSmallestVertexCycle-"></a>2408 <span class="k">sub </span><span class="m">GetSizeOfSmallestVertexCycle</span> <span class="s">{</span> | 
|  | 2422 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> | 
|  | 2423 2410 | 
|  | 2424 2411   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCycleSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'SmallestCycle'</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2425 2412 <span class="s">}</span> | 
|  | 2426 2413 | 
|  | 2427 2414 <span class="c"># Get size of largest cycle containing specified vertex...</span> | 
|  | 2428 2415 <span class="c">#</span> | 
|  | 2429 <a name="GetSizeOfLargestVertexCycle-"></a>2416 <span class="k">sub </span><span class="m">GetSizeOfLargestVertexCycle</span> <span class="s">{</span> | 
|  | 2430 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> | 
|  | 2431 2418 | 
|  | 2432 2419   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCycleSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'LargestCycle'</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2433 2420 <span class="s">}</span> | 
|  | 2434 2421 | 
|  | 2435 2422 <span class="c"># Get number of cycles containing specified vertex...</span> | 
|  | 2436 2423 <span class="c">#</span> | 
|  | 2437 <a name="GetNumOfVertexCycles-"></a>2424 <span class="k">sub </span><span class="m">GetNumOfVertexCycles</span> <span class="s">{</span> | 
|  | 2438 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> | 
|  | 2439 2426 | 
|  | 2440 2427   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'AllSizes'</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> | 
|  | 2441 2428 <span class="s">}</span> | 
|  | 2442 2429 | 
|  | 2443 2430 <span class="c"># Get number of cycles with odd size containing specified vertex...</span> | 
|  | 2444 2431 <span class="c">#</span> | 
|  | 2445 <a name="GetNumOfVertexCyclesWithOddSize-"></a>2432 <span class="k">sub </span><span class="m">GetNumOfVertexCyclesWithOddSize</span> <span class="s">{</span> | 
|  | 2446 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> | 
|  | 2447 2434 | 
|  | 2448 2435   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'OddSize'</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> | 
|  | 2449 2436 <span class="s">}</span> | 
|  | 2450 2437 | 
|  | 2451 2438 <span class="c"># Get number of cycles with even size containing specified vertex...</span> | 
|  | 2452 2439 <span class="c">#</span> | 
|  | 2453 <a name="GetNumOfVertexCyclesWithEvenSize-"></a>2440 <span class="k">sub </span><span class="m">GetNumOfVertexCyclesWithEvenSize</span> <span class="s">{</span> | 
|  | 2454 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> | 
|  | 2455 2442 | 
|  | 2456 2443   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'EvenSize'</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> | 
|  | 2457 2444 <span class="s">}</span> | 
|  | 2458 2445 | 
|  | 2459 2446 <span class="c"># Get number of cycles with specified size containing specified vertex...</span> | 
|  | 2460 2447 <span class="c">#</span> | 
|  | 2461 <a name="GetNumOfVertexCyclesWithSize-"></a>2448 <span class="k">sub </span><span class="m">GetNumOfVertexCyclesWithSize</span> <span class="s">{</span> | 
|  | 2462 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> | 
|  | 2463 2450 | 
|  | 2464 2451   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'SpecifiedSize'</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> | 
|  | 2465 2452 <span class="s">}</span> | 
|  | 2466 2453 | 
|  | 2467 2454 <span class="c"># Get number of cycles with size less than specified size containing specified vertex...</span> | 
|  | 2468 2455 <span class="c">#</span> | 
|  | 2469 <a name="GetNumOfVertexCyclesWithSizeLessThan-"></a>2456 <span class="k">sub </span><span class="m">GetNumOfVertexCyclesWithSizeLessThan</span> <span class="s">{</span> | 
|  | 2470 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> | 
|  | 2471 2458 | 
|  | 2472 2459   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'SizeLessThan'</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> | 
|  | 2473 2460 <span class="s">}</span> | 
|  | 2474 2461 | 
|  | 2475 2462 <span class="c"># Get number of cycles with size greater than specified size containing specified vertex...</span> | 
|  | 2476 2463 <span class="c">#</span> | 
|  | 2477 <a name="GetNumOfVertexCyclesWithSizeGreaterThan-"></a>2464 <span class="k">sub </span><span class="m">GetNumOfVertexCyclesWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 2478 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> | 
|  | 2479 2466 | 
|  | 2480 2467   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'SizeGreaterThan'</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> | 
|  | 2481 2468 <span class="s">}</span> | 
|  | 2482 2469 | 
|  | 2483 2470 <span class="c"># Get smallest cycle containing specified vertex...</span> | 
|  | 2484 2471 <span class="c">#</span> | 
|  | 2485 <a name="GetSmallestVertexCycle-"></a>2472 <span class="k">sub </span><span class="m">GetSmallestVertexCycle</span> <span class="s">{</span> | 
|  | 2486 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> | 
|  | 2487 2474 | 
|  | 2488 2475   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCycle</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'SmallestCycle'</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2489 2476 <span class="s">}</span> | 
|  | 2490 2477 | 
|  | 2491 2478 <span class="c"># Get largest cycle containing specified vertex...</span> | 
|  | 2492 2479 <span class="c">#</span> | 
|  | 2493 <a name="GetLargestVertexCycle-"></a>2480 <span class="k">sub </span><span class="m">GetLargestVertexCycle</span> <span class="s">{</span> | 
|  | 2494 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> | 
|  | 2495 2482 | 
|  | 2496 2483   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCycle</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'LargestCycle'</span><span class="cm">,</span> <span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2497 2484 <span class="s">}</span> | 
|  | 2498 2485 | 
|  | 2499 2486 <span class="c"># Get cycles containing specified vertex...</span> | 
|  | 2500 2487 <span class="c">#</span> | 
|  | 2501 <a name="GetVertexCycles-"></a>2488 <span class="k">sub </span><span class="m">GetVertexCycles</span> <span class="s">{</span> | 
|  | 2502 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> | 
|  | 2503 2490 | 
|  | 2504 2491   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'AllSizes'</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> | 
|  | 2505 2492 <span class="s">}</span> | 
|  | 2506 2493 | 
|  | 2507 2494 <span class="c"># Get cycles with odd size containing specified vertex...</span> | 
|  | 2508 2495 <span class="c">#</span> | 
|  | 2509 <a name="GetVertexCyclesWithOddSize-"></a>2496 <span class="k">sub </span><span class="m">GetVertexCyclesWithOddSize</span> <span class="s">{</span> | 
|  | 2510 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> | 
|  | 2511 2498 | 
|  | 2512 2499   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'OddSize'</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> | 
|  | 2513 2500 <span class="s">}</span> | 
|  | 2514 2501 | 
|  | 2515 2502 <span class="c"># Get cycles with even size containing specified vertex...</span> | 
|  | 2516 2503 <span class="c">#</span> | 
|  | 2517 <a name="GetVertexCyclesWithEvenSize-"></a>2504 <span class="k">sub </span><span class="m">GetVertexCyclesWithEvenSize</span> <span class="s">{</span> | 
|  | 2518 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> | 
|  | 2519 2506 | 
|  | 2520 2507   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'EvenSize'</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> | 
|  | 2521 2508 <span class="s">}</span> | 
|  | 2522 2509 | 
|  | 2523 2510 <span class="c"># Get cycles with specified size containing specified vertex...</span> | 
|  | 2524 2511 <span class="c">#</span> | 
|  | 2525 <a name="GetVertexCyclesWithSize-"></a>2512 <span class="k">sub </span><span class="m">GetVertexCyclesWithSize</span> <span class="s">{</span> | 
|  | 2526 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> | 
|  | 2527 2514 | 
|  | 2528 2515   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'SpecifiedSize'</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> | 
|  | 2529 2516 <span class="s">}</span> | 
|  | 2530 2517 | 
|  | 2531 2518 <span class="c"># Get cycles with size less than specified size containing specified vertex...</span> | 
|  | 2532 2519 <span class="c">#</span> | 
|  | 2533 <a name="GetVertexCyclesWithSizeLessThan-"></a>2520 <span class="k">sub </span><span class="m">GetVertexCyclesWithSizeLessThan</span> <span class="s">{</span> | 
|  | 2534 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> | 
|  | 2535 2522 | 
|  | 2536 2523   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'SizeLessThan'</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> | 
|  | 2537 2524 <span class="s">}</span> | 
|  | 2538 2525 | 
|  | 2539 2526 <span class="c"># Get cycles with size greater than specified size containing specified vertex...</span> | 
|  | 2540 2527 <span class="c">#</span> | 
|  | 2541 <a name="GetVertexCyclesWithSizeGreaterThan-"></a>2528 <span class="k">sub </span><span class="m">GetVertexCyclesWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 2542 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> | 
|  | 2543 2530 | 
|  | 2544 2531   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'VertexCycle'</span><span class="cm">,</span> <span class="q">'SizeGreaterThan'</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> | 
|  | 2545 2532 <span class="s">}</span> | 
|  | 2546 2533 | 
|  | 2547 2534 <span class="c"># Is edge in a cycle?</span> | 
|  | 2548 2535 <span class="c">#</span> | 
|  | 2549 <a name="IsCyclicEdge-"></a>2536 <span class="k">sub </span><span class="m">IsCyclicEdge</span> <span class="s">{</span> | 
|  | 2550 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> | 
|  | 2551 2538 | 
|  | 2552 2539   <span class="k">return</span> <span class="i">$This</span><span class="i">->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> | 
|  | 2553 2540 <span class="s">}</span> | 
|  | 2554 2541 | 
|  | 2555 2542 <span class="c"># Is edge in a only one cycle?</span> | 
|  | 2556 2543 <span class="c">#</span> | 
|  | 2557 <a name="IsUnicyclicEdge-"></a>2544 <span class="k">sub </span><span class="m">IsUnicyclicEdge</span> <span class="s">{</span> | 
|  | 2558 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> | 
|  | 2559 2546 | 
|  | 2560 2547   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->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> | 
|  | 2561 2548 <span class="s">}</span> | 
|  | 2562 2549 | 
|  | 2563 2550 <span class="c"># Is Edge not in a cycle?</span> | 
|  | 2564 2551 <span class="c">#</span> | 
|  | 2565 <a name="IsAcyclicEdge-"></a>2552 <span class="k">sub </span><span class="m">IsAcyclicEdge</span> <span class="s">{</span> | 
|  | 2566 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> | 
|  | 2567 2554 | 
|  | 2568 2555   <span class="k">return</span> <span class="i">$This</span><span class="i">->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> | 
|  | 2569 2556 <span class="s">}</span> | 
|  | 2570 2557 | 
|  | 2571 2558 <span class="c"># Get size of smallest cycle containing specified edge...</span> | 
|  | 2572 2559 <span class="c">#</span> | 
|  | 2573 <a name="GetSizeOfSmallestEdgeCycle-"></a>2560 <span class="k">sub </span><span class="m">GetSizeOfSmallestEdgeCycle</span> <span class="s">{</span> | 
|  | 2574 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> | 
|  | 2575 2562 | 
|  | 2576 2563   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCycleSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'SmallestCycle'</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> | 
|  | 2577 2564 <span class="s">}</span> | 
|  | 2578 2565 | 
|  | 2579 2566 <span class="c"># Get size of largest cycle containing specified edge...</span> | 
|  | 2580 2567 <span class="c">#</span> | 
|  | 2581 <a name="GetSizeOfLargestEdgeCycle-"></a>2568 <span class="k">sub </span><span class="m">GetSizeOfLargestEdgeCycle</span> <span class="s">{</span> | 
|  | 2582 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> | 
|  | 2583 2570 | 
|  | 2584 2571   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCycleSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'LargestCycle'</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> | 
|  | 2585 2572 <span class="s">}</span> | 
|  | 2586 2573 | 
|  | 2587 2574 <span class="c"># Get number of cycles containing specified edge...</span> | 
|  | 2588 2575 <span class="c">#</span> | 
|  | 2589 <a name="GetNumOfEdgeCycles-"></a>2576 <span class="k">sub </span><span class="m">GetNumOfEdgeCycles</span> <span class="s">{</span> | 
|  | 2590 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> | 
|  | 2591 2578 | 
|  | 2592 2579   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'AllSizes'</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> | 
|  | 2593 2580 <span class="s">}</span> | 
|  | 2594 2581 | 
|  | 2595 2582 <span class="c"># Get number of cycles with odd size containing specified edge...</span> | 
|  | 2596 2583 <span class="c">#</span> | 
|  | 2597 <a name="GetNumOfEdgeCyclesWithOddSize-"></a>2584 <span class="k">sub </span><span class="m">GetNumOfEdgeCyclesWithOddSize</span> <span class="s">{</span> | 
|  | 2598 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> | 
|  | 2599 2586 | 
|  | 2600 2587   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'OddSize'</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> | 
|  | 2601 2588 <span class="s">}</span> | 
|  | 2602 2589 | 
|  | 2603 2590 <span class="c"># Get number of cycles with even size containing specified edge...</span> | 
|  | 2604 2591 <span class="c">#</span> | 
|  | 2605 <a name="GetNumOfEdgeCyclesWithEvenSize-"></a>2592 <span class="k">sub </span><span class="m">GetNumOfEdgeCyclesWithEvenSize</span> <span class="s">{</span> | 
|  | 2606 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> | 
|  | 2607 2594 | 
|  | 2608 2595   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'EvenSize'</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> | 
|  | 2609 2596 <span class="s">}</span> | 
|  | 2610 2597 | 
|  | 2611 2598 <span class="c"># Get number of cycles with specified size containing specified edge...</span> | 
|  | 2612 2599 <span class="c">#</span> | 
|  | 2613 <a name="GetNumOfEdgeCyclesWithSize-"></a>2600 <span class="k">sub </span><span class="m">GetNumOfEdgeCyclesWithSize</span> <span class="s">{</span> | 
|  | 2614 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> | 
|  | 2615 2602 | 
|  | 2616 2603   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'SpecifiedSize'</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> | 
|  | 2617 2604 <span class="s">}</span> | 
|  | 2618 2605 | 
|  | 2619 2606 <span class="c"># Get number of cycles with size less than specified size containing specified edge...</span> | 
|  | 2620 2607 <span class="c">#</span> | 
|  | 2621 <a name="GetNumOfEdgeCyclesWithSizeLessThan-"></a>2608 <span class="k">sub </span><span class="m">GetNumOfEdgeCyclesWithSizeLessThan</span> <span class="s">{</span> | 
|  | 2622 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> | 
|  | 2623 2610 | 
|  | 2624 2611   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'SizeLessThan'</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> | 
|  | 2625 2612 <span class="s">}</span> | 
|  | 2626 2613 | 
|  | 2627 2614 <span class="c"># Get number of cycles with size greater than specified size containing specified edge...</span> | 
|  | 2628 2615 <span class="c">#</span> | 
|  | 2629 <a name="GetNumOfEdgeCyclesWithSizeGreaterThan-"></a>2616 <span class="k">sub </span><span class="m">GetNumOfEdgeCyclesWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 2630 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> | 
|  | 2631 2618 | 
|  | 2632 2619   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetNumOfCyclesWithSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'SizeGreaterThan'</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> | 
|  | 2633 2620 <span class="s">}</span> | 
|  | 2634 2621 | 
|  | 2635 2622 <span class="c"># Get smallest cycle containing specified edge...</span> | 
|  | 2636 2623 <span class="c">#</span> | 
|  | 2637 <a name="GetSmallestEdgeCycle-"></a>2624 <span class="k">sub </span><span class="m">GetSmallestEdgeCycle</span> <span class="s">{</span> | 
|  | 2638 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> | 
|  | 2639 2626 | 
|  | 2640 2627   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCycle</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'SmallestCycle'</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> | 
|  | 2641 2628 <span class="s">}</span> | 
|  | 2642 2629 | 
|  | 2643 2630 <span class="c"># Get largest cycle containing specified edge...</span> | 
|  | 2644 2631 <span class="c">#</span> | 
|  | 2645 <a name="GetLargestEdgeCycle-"></a>2632 <span class="k">sub </span><span class="m">GetLargestEdgeCycle</span> <span class="s">{</span> | 
|  | 2646 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> | 
|  | 2647 2634 | 
|  | 2648 2635   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCycle</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'LargestCycle'</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> | 
|  | 2649 2636 <span class="s">}</span> | 
|  | 2650 2637 | 
|  | 2651 2638 <span class="c"># Get cycles containing specified edge...</span> | 
|  | 2652 2639 <span class="c">#</span> | 
|  | 2653 <a name="GetEdgeCycles-"></a>2640 <span class="k">sub </span><span class="m">GetEdgeCycles</span> <span class="s">{</span> | 
|  | 2654 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> | 
|  | 2655 2642 | 
|  | 2656 2643   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'AllSizes'</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> | 
|  | 2657 2644 <span class="s">}</span> | 
|  | 2658 2645 | 
|  | 2659 2646 <span class="c"># Get cycles with odd size containing specified edge...</span> | 
|  | 2660 2647 <span class="c">#</span> | 
|  | 2661 <a name="GetEdgeCyclesWithOddSize-"></a>2648 <span class="k">sub </span><span class="m">GetEdgeCyclesWithOddSize</span> <span class="s">{</span> | 
|  | 2662 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> | 
|  | 2663 2650 | 
|  | 2664 2651   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'OddSize'</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> | 
|  | 2665 2652 <span class="s">}</span> | 
|  | 2666 2653 | 
|  | 2667 2654 <span class="c"># Get cycles with even size containing specified edge...</span> | 
|  | 2668 2655 <span class="c">#</span> | 
|  | 2669 <a name="GetEdgeCyclesWithEvenSize-"></a>2656 <span class="k">sub </span><span class="m">GetEdgeCyclesWithEvenSize</span> <span class="s">{</span> | 
|  | 2670 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> | 
|  | 2671 2658 | 
|  | 2672 2659   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'EvenSize'</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> | 
|  | 2673 2660 <span class="s">}</span> | 
|  | 2674 2661 | 
|  | 2675 2662 <span class="c"># Get cycles with specified size containing specified edge...</span> | 
|  | 2676 2663 <span class="c">#</span> | 
|  | 2677 <a name="GetEdgeCyclesWithSize-"></a>2664 <span class="k">sub </span><span class="m">GetEdgeCyclesWithSize</span> <span class="s">{</span> | 
|  | 2678 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> | 
|  | 2679 2666 | 
|  | 2680 2667   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'SpecifiedSize'</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> | 
|  | 2681 2668 <span class="s">}</span> | 
|  | 2682 2669 | 
|  | 2683 2670 <span class="c"># Get cycles with size less than specified size containing specified edge...</span> | 
|  | 2684 2671 <span class="c">#</span> | 
|  | 2685 <a name="GetEdgeCyclesWithSizeLessThan-"></a>2672 <span class="k">sub </span><span class="m">GetEdgeCyclesWithSizeLessThan</span> <span class="s">{</span> | 
|  | 2686 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> | 
|  | 2687 2674 | 
|  | 2688 2675   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'SizeLessThan'</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> | 
|  | 2689 2676 <span class="s">}</span> | 
|  | 2690 2677 | 
|  | 2691 2678 <span class="c"># Get cycles with size greater than specified size containing specified edge...</span> | 
|  | 2692 2679 <span class="c">#</span> | 
|  | 2693 <a name="GetEdgeCyclesWithSizeGreaterThan-"></a>2680 <span class="k">sub </span><span class="m">GetEdgeCyclesWithSizeGreaterThan</span> <span class="s">{</span> | 
|  | 2694 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> | 
|  | 2695 2682 | 
|  | 2696 2683   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetCyclesWithSize</span><span class="s">(</span><span class="q">'EdgeCycle'</span><span class="cm">,</span> <span class="q">'SizeGreaterThan'</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> | 
|  | 2697 2684 <span class="s">}</span> | 
|  | 2698 2685 | 
|  | 2699 2686 <span class="c"># Get size of specified cycle type...</span> | 
|  | 2700 2687 <span class="c">#</span> | 
|  | 2701 <a name="_GetCycleSize-"></a>2688 <span class="k">sub </span><span class="m">_GetCycleSize</span> <span class="s">{</span> | 
|  | 2702 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> | 
|  | 2703 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> | 
|  | 2704 2691 | 
|  | 2705 2692   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2706 2693     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2707 2694   <span class="s">}</span> | 
|  | 2708 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> | 
|  | 2709 2696     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertexProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2710 2697       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2711 2698     <span class="s">}</span> | 
|  | 2712 2699   <span class="s">}</span> | 
|  | 2713 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> | 
|  | 2714 2701     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasEdgeProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2715 2702       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2716 2703     <span class="s">}</span> | 
|  | 2717 2704   <span class="s">}</span> | 
|  | 2718 2705 | 
|  | 2719 2706   <span class="j">MODE:</span> <span class="s">{</span> | 
|  | 2720 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">->GetGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2721 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">->GetVertexProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2722 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">->GetEdgeProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2723 2710       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2724 2711   <span class="s">}</span> | 
|  | 2725 2712 | 
|  | 2726 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> | 
|  | 2727 2714     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2728 2715   <span class="s">}</span> | 
|  | 2729 2716 | 
|  | 2730 2717   <span class="j">CYCLESIZE:</span> <span class="s">{</span> | 
|  | 2731 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>->[<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> | 
|  | 2732 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>->[<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> | 
|  | 2733 2720       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2734 2721   <span class="s">}</span> | 
|  | 2735 2722   <span class="i">$Size</span> = <span class="i">$CyclicPath</span><span class="i">->GetLength</span><span class="s">(</span><span class="s">)</span> - <span class="n">1</span><span class="sc">;</span> | 
|  | 2736 2723 | 
|  | 2737 2724   <span class="k">return</span> <span class="i">$Size</span><span class="sc">;</span> | 
|  | 2738 2725 <span class="s">}</span> | 
|  | 2739 2726 | 
|  | 2740 2727 <span class="c"># Get of specified cycle size...</span> | 
|  | 2741 2728 <span class="c">#</span> | 
|  | 2742 <a name="_GetCycle-"></a>2729 <span class="k">sub </span><span class="m">_GetCycle</span> <span class="s">{</span> | 
|  | 2743 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> | 
|  | 2744 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> | 
|  | 2745 2732 | 
|  | 2746 2733   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2747 2734     <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2748 2735   <span class="s">}</span> | 
|  | 2749 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> | 
|  | 2750 2737     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertexProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2751 2738       <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2752 2739     <span class="s">}</span> | 
|  | 2753 2740   <span class="s">}</span> | 
|  | 2754 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> | 
|  | 2755 2742     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasEdgeProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2756 2743       <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2757 2744     <span class="s">}</span> | 
|  | 2758 2745   <span class="s">}</span> | 
|  | 2759 2746 | 
|  | 2760 2747   <span class="j">MODE:</span> <span class="s">{</span> | 
|  | 2761 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">->GetGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2762 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">->GetVertexProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2763 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">->GetEdgeProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2764 2751       <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2765 2752   <span class="s">}</span> | 
|  | 2766 2753 | 
|  | 2767 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> | 
|  | 2768 2755     <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2769 2756   <span class="s">}</span> | 
|  | 2770 2757 | 
|  | 2771 2758   <span class="j">CYCLESIZE:</span> <span class="s">{</span> | 
|  | 2772 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>->[<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> | 
|  | 2773 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>->[<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> | 
|  | 2774 2761       <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2775 2762   <span class="s">}</span> | 
|  | 2776 2763   <span class="k">return</span> <span class="i">$CyclicPath</span><span class="sc">;</span> | 
|  | 2777 2764 <span class="s">}</span> | 
|  | 2778 2765 | 
|  | 2779 2766 <span class="c"># Get num of cycles in graph...</span> | 
|  | 2780 2767 <span class="c">#</span> | 
|  | 2781 <a name="_GetNumOfCyclesWithSize-"></a>2768 <span class="k">sub </span><span class="m">_GetNumOfCyclesWithSize</span> <span class="s">{</span> | 
|  | 2782 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> | 
|  | 2783 2770   <span class="k">my</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2784 2771 | 
|  | 2785 2772   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2786 2773     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2787 2774   <span class="s">}</span> | 
|  | 2788 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> | 
|  | 2789 2776     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertexProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2790 2777       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2791 2778     <span class="s">}</span> | 
|  | 2792 2779   <span class="s">}</span> | 
|  | 2793 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> | 
|  | 2794 2781     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasEdgeProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2795 2782       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2796 2783     <span class="s">}</span> | 
|  | 2797 2784   <span class="s">}</span> | 
|  | 2798 2785 | 
|  | 2799 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> | 
|  | 2800 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> | 
|  | 2801 2788       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_GetNumOfCyclesWithSize: Cycle size muse be defined..."</span><span class="sc">;</span> | 
|  | 2802 2789       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2803 2790     <span class="s">}</span> | 
|  | 2804 2791     <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedSize</span> < <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2805 2792       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_GetNumOfCyclesWithSize: Specified cycle size, $SpecifiedSize, must be > 0 ..."</span><span class="sc">;</span> | 
|  | 2806 2793       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2807 2794     <span class="s">}</span> | 
|  | 2808 2795   <span class="s">}</span> | 
|  | 2809 2796 | 
|  | 2810 2797   <span class="j">MODE:</span> <span class="s">{</span> | 
|  | 2811 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">->GetGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2812 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">->GetVertexProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2813 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">->GetEdgeProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2814 2801       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2815 2802   <span class="s">}</span> | 
|  | 2816 2803 | 
|  | 2817 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> | 
|  | 2818 2805     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2819 2806   <span class="s">}</span> | 
|  | 2820 2807   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfCycles</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2821 2808 | 
|  | 2822 2809   <span class="i">$NumOfCycles</span> = <span class="i">$This</span><span class="i">->_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> | 
|  | 2823 2810 | 
|  | 2824 2811   <span class="k">return</span> <span class="i">$NumOfCycles</span><span class="sc">;</span> | 
|  | 2825 2812 <span class="s">}</span> | 
|  | 2826 2813 | 
|  | 2827 2814 <span class="c"># Get cycles in graph...</span> | 
|  | 2828 2815 <span class="c">#</span> | 
|  | 2829 <a name="_GetCyclesWithSize-"></a>2816 <span class="k">sub </span><span class="m">_GetCyclesWithSize</span> <span class="s">{</span> | 
|  | 2830 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> | 
|  | 2831 2818   <span class="k">my</span><span class="s">(</span><span class="i">$ActiveCyclicPathsRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2832 2819 | 
|  | 2833 2820   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2834 2821     <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2835 2822   <span class="s">}</span> | 
|  | 2836 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> | 
|  | 2837 2824     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasVertexProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</span><span class="cm">,</span> <span class="i">$VertexID1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2838 2825       <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2839 2826     <span class="s">}</span> | 
|  | 2840 2827   <span class="s">}</span> | 
|  | 2841 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> | 
|  | 2842 2829     <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->HasEdgeProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2843 2830       <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2844 2831     <span class="s">}</span> | 
|  | 2845 2832   <span class="s">}</span> | 
|  | 2846 2833 | 
|  | 2847 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> | 
|  | 2848 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> | 
|  | 2849 2836       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_GetCyclesWithSize: Cycle size must be defined..."</span><span class="sc">;</span> | 
|  | 2850 2837       <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2851 2838     <span class="s">}</span> | 
|  | 2852 2839     <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedSize</span> < <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2853 2840       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->_GetCyclesWithSize: Specified cycle size, $SpecifiedSize, must be > 0 ..."</span><span class="sc">;</span> | 
|  | 2854 2841       <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2855 2842     <span class="s">}</span> | 
|  | 2856 2843   <span class="s">}</span> | 
|  | 2857 2844 | 
|  | 2858 2845   <span class="j">MODE:</span> <span class="s">{</span> | 
|  | 2859 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">->GetGraphProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2860 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">->GetVertexProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2861 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">->GetEdgeProperty</span><span class="s">(</span><span class="q">'ActiveCyclicPaths'</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> | 
|  | 2862 2849       <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2863 2850     <span class="s">}</span> | 
|  | 2864 2851 | 
|  | 2865 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> | 
|  | 2866 2853     <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2867 2854   <span class="s">}</span> | 
|  | 2868 2855   <span class="k">return</span> <span class="i">$This</span><span class="i">->_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> | 
|  | 2869 2856 <span class="s">}</span> | 
|  | 2870 2857 | 
|  | 2871 2858 <span class="c"># Get cycles information...</span> | 
|  | 2872 2859 <span class="c">#</span> | 
|  | 2873 <a name="_GetCycles-"></a>2860 <span class="k">sub </span><span class="m">_GetCycles</span> <span class="s">{</span> | 
|  | 2874 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> | 
|  | 2875 2862 | 
|  | 2876 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> | 
|  | 2877 2864     <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetEmptyCycles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2878 2865   <span class="s">}</span> | 
|  | 2879 2866 | 
|  | 2880 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> | 
|  | 2881 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> | 
|  | 2882 2869   <span class="s">}</span> | 
|  | 2883 2870 | 
|  | 2884 2871   <span class="c"># Get appropriate cycles...</span> | 
|  | 2885 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> | 
|  | 2886 2873   <span class="i">@FilteredCyclicPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2887 2874 | 
|  | 2888 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> | 
|  | 2889 2876     <span class="i">$Size</span> = <span class="i">$CyclicPath</span><span class="i">->GetLength</span><span class="s">(</span><span class="s">)</span> - <span class="n">1</span><span class="sc">;</span> | 
|  | 2890 2877     <span class="j">SIZEMODE:</span> <span class="s">{</span> | 
|  | 2891 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> | 
|  | 2892 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> | 
|  | 2893 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> < <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> | 
|  | 2894 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> > <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> | 
|  | 2895 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> | 
|  | 2896 2883       <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 2897 2884     <span class="s">}</span> | 
|  | 2898 2885   <span class="s">}</span> | 
|  | 2899 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> | 
|  | 2900 2887 <span class="s">}</span> | 
|  | 2901 2888 | 
|  | 2902 2889 <span class="c"># Return empty cyles array...</span> | 
|  | 2903 2890 <span class="c">#</span> | 
|  | 2904 <a name="_GetEmptyCycles-"></a>2891 <span class="k">sub </span><span class="m">_GetEmptyCycles</span> <span class="s">{</span> | 
|  | 2905 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> | 
|  | 2906 2893   <span class="k">my</span><span class="s">(</span><span class="i">@CyclicPaths</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2907 2894 | 
|  | 2908 2895   <span class="i">@CyclicPaths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2909 2896 | 
|  | 2910 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> | 
|  | 2911 2898 <span class="s">}</span> | 
|  | 2912 2899 | 
|  | 2913 2900 <span class="c"># Does graph contains fused cycles?</span> | 
|  | 2914 <a name="HasFusedCycles-"></a>2901 <span class="k">sub </span><span class="m">HasFusedCycles</span> <span class="s">{</span> | 
|  | 2915 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> | 
|  | 2916 2903 | 
|  | 2917 2904   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->HasGraphProperty</span><span class="s">(</span><span class="q">'FusedActiveCyclicPaths'</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> | 
|  | 2918 2905 <span class="s">}</span> | 
|  | 2919 2906 | 
|  | 2920 2907 <span class="c"># Return a reference to fused cycle sets lists containing references to lists of cyclic path objects</span> | 
|  | 2921 2908 <span class="c"># in each fused cycle set and a reference to a list containing non-fused cyclic paths...</span> | 
|  | 2922 2909 <span class="c">#</span> | 
|  | 2923 <a name="GetFusedAndNonFusedCycles-"></a>2910 <span class="k">sub </span><span class="m">GetFusedAndNonFusedCycles</span> <span class="s">{</span> | 
|  | 2924 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> | 
|  | 2925 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> | 
|  | 2926 2913 | 
|  | 2927 2914   <span class="i">$FusedCycleSetsRef</span> = <span class="i">$This</span><span class="i">->HasGraphProperty</span><span class="s">(</span><span class="q">'FusedActiveCyclicPaths'</span><span class="s">)</span> ? <span class="i">$This</span><span class="i">->GetGraphProperty</span><span class="s">(</span><span class="q">'FusedActiveCyclicPaths'</span><span class="s">)</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 2928 2915   <span class="i">$NonFusedCyclesRef</span> = <span class="i">$This</span><span class="i">->HasGraphProperty</span><span class="s">(</span><span class="q">'NonFusedActiveCyclicPaths'</span><span class="s">)</span> ? <span class="i">$This</span><span class="i">->GetGraphProperty</span><span class="s">(</span><span class="q">'NonFusedActiveCyclicPaths'</span><span class="s">)</span> <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 2929 2916 | 
|  | 2930 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> | 
|  | 2931 2918 <span class="s">}</span> | 
|  | 2932 2919 | 
|  | 2933 2920 <span class="c"># Get vertices of connected components as a list containing references to</span> | 
|  | 2934 2921 <span class="c"># lists of vertices for each component  sorted in order of its decreasing size...</span> | 
|  | 2935 2922 <span class="c">#</span> | 
|  | 2936 <a name="GetConnectedComponentsVertices-"></a>2923 <span class="k">sub </span><span class="m">GetConnectedComponentsVertices</span> <span class="s">{</span> | 
|  | 2937 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> | 
|  | 2938 2925   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2939 2926 | 
|  | 2940 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> | 
|  | 2941 2928   <span class="i">$PathsTraversal</span><span class="i">->PerformDepthFirstSearch</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2942 2929 | 
|  | 2943 2930   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">->GetConnectedComponentsVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2944 2931 <span class="s">}</span> | 
|  | 2945 2932 | 
|  | 2946 2933 <span class="c"># Get a list of topologically sorted vertrices starting from a specified vertex or</span> | 
|  | 2947 2934 <span class="c"># an arbitrary vertex in the graph...</span> | 
|  | 2948 2935 <span class="c">#</span> | 
|  | 2949 <a name="GetTopologicallySortedVertices-"></a>2936 <span class="k">sub </span><span class="m">GetTopologicallySortedVertices</span> <span class="s">{</span> | 
|  | 2950 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> | 
|  | 2951 2938   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2952 2939 | 
|  | 2953 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> | 
|  | 2954 2941   <span class="i">$PathsTraversal</span><span class="i">->PerformBreadthFirstSearch</span><span class="s">(</span><span class="i">$RootVertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2955 2942 | 
|  | 2956 2943   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2957 2944 <span class="s">}</span> | 
|  | 2958 2945 | 
|  | 2959 2946 <span class="c"># Get a list of paths starting from a specified vertex with length upto specified length</span> | 
|  | 2960 2947 <span class="c"># and no sharing of edges in paths traversed. By default, cycles are included in paths.</span> | 
|  | 2961 2948 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span> | 
|  | 2962 2949 <span class="c">#</span> | 
|  | 2963 <a name="GetPathsStartingAtWithLengthUpto-"></a>2950 <span class="k">sub </span><span class="m">GetPathsStartingAtWithLengthUpto</span> <span class="s">{</span> | 
|  | 2964 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> | 
|  | 2965 2952   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2966 2953 | 
|  | 2967 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> | 
|  | 2968 2955   <span class="i">$PathsTraversal</span><span class="i">->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> | 
|  | 2969 2956 | 
|  | 2970 2957   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">->GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2971 2958 <span class="s">}</span> | 
|  | 2972 2959 | 
|  | 2973 2960 <span class="c"># Get a list of paths starting from a specified vertex with specified length</span> | 
|  | 2974 2961 <span class="c"># and no sharing of edges in paths traversed. By default, cycles are included in paths.</span> | 
|  | 2975 2962 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span> | 
|  | 2976 2963 <span class="c">#</span> | 
|  | 2977 <a name="GetPathsStartingAtWithLength-"></a>2964 <span class="k">sub </span><span class="m">GetPathsStartingAtWithLength</span> <span class="s">{</span> | 
|  | 2978 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> | 
|  | 2979 2966   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2980 2967 | 
|  | 2981 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> | 
|  | 2982 2969   <span class="i">$PathsTraversal</span><span class="i">->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> | 
|  | 2983 2970 | 
|  | 2984 2971   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">->GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2985 2972 <span class="s">}</span> | 
|  | 2986 2973 | 
|  | 2987 2974 <span class="c"># Get a list of paths with all possible lengths starting from a specified vertex</span> | 
|  | 2988 2975 <span class="c"># with no sharing of edges in paths traversed. By default, cycles are included in paths.</span> | 
|  | 2989 2976 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span> | 
|  | 2990 2977 <span class="c">#</span> | 
|  | 2991 <a name="GetPathsStartingAt-"></a>2978 <span class="k">sub </span><span class="m">GetPathsStartingAt</span> <span class="s">{</span> | 
|  | 2992 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> | 
|  | 2993 2980   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2994 2981 | 
|  | 2995 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> | 
|  | 2996 2983   <span class="i">$PathsTraversal</span><span class="i">->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> | 
|  | 2997 2984 | 
|  | 2998 2985   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">->GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2999 2986 <span class="s">}</span> | 
|  | 3000 2987 | 
|  | 3001 2988 <span class="c"># Get a list of all paths starting from a specified vertex with length upto a specified length</span> | 
|  | 3002 2989 <span class="c"># with sharing of edges in paths traversed. By default, cycles are included in paths.</span> | 
|  | 3003 2990 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span> | 
|  | 3004 2991 <span class="c">#</span> | 
|  | 3005 <a name="GetAllPathsStartingAtWithLengthUpto-"></a>2992 <span class="k">sub </span><span class="m">GetAllPathsStartingAtWithLengthUpto</span> <span class="s">{</span> | 
|  | 3006 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> | 
|  | 3007 2994   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3008 2995 | 
|  | 3009 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> | 
|  | 3010 2997   <span class="i">$PathsTraversal</span><span class="i">->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> | 
|  | 3011 2998 | 
|  | 3012 2999   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">->GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3013 3000 <span class="s">}</span> | 
|  | 3014 3001 | 
|  | 3015 3002 <span class="c"># Get a list of all paths starting from a specified vertex with specified length</span> | 
|  | 3016 3003 <span class="c"># with sharing of edges in paths traversed. By default, cycles are included in paths.</span> | 
|  | 3017 3004 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span> | 
|  | 3018 3005 <span class="c">#</span> | 
|  | 3019 <a name="GetAllPathsStartingAtWithLength-"></a>3006 <span class="k">sub </span><span class="m">GetAllPathsStartingAtWithLength</span> <span class="s">{</span> | 
|  | 3020 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> | 
|  | 3021 3008   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3022 3009 | 
|  | 3023 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> | 
|  | 3024 3011   <span class="i">$PathsTraversal</span><span class="i">->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> | 
|  | 3025 3012 | 
|  | 3026 3013   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">->GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3027 3014 <span class="s">}</span> | 
|  | 3028 3015 | 
|  | 3029 3016 | 
|  | 3030 3017 <span class="c"># Get a list of all paths with all possible lengths starting from a specified vertex</span> | 
|  | 3031 3018 <span class="c"># with sharing of edges in paths traversed. By default, cycles are included in paths.</span> | 
|  | 3032 3019 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span> | 
|  | 3033 3020 <span class="c">#</span> | 
|  | 3034 <a name="GetAllPathsStartingAt-"></a>3021 <span class="k">sub </span><span class="m">GetAllPathsStartingAt</span> <span class="s">{</span> | 
|  | 3035 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> | 
|  | 3036 3023   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3037 3024 | 
|  | 3038 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> | 
|  | 3039 3026   <span class="i">$PathsTraversal</span><span class="i">->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> | 
|  | 3040 3027 | 
|  | 3041 3028   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">->GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3042 3029 <span class="s">}</span> | 
|  | 3043 3030 | 
|  | 3044 3031 <span class="c"># Get a reference to list of paths starting from each vertex in graph with length upto specified</span> | 
|  | 3045 3032 <span class="c"># length and no sharing of edges in paths traversed. By default, cycles are included in paths.</span> | 
|  | 3046 3033 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span> | 
|  | 3047 3034 <span class="c">#</span> | 
|  | 3048 <a name="GetPathsWithLengthUpto-"></a>3035 <span class="k">sub </span><span class="m">GetPathsWithLengthUpto</span> <span class="s">{</span> | 
|  | 3049 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> | 
|  | 3050 3037 | 
|  | 3051 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> | 
|  | 3052 3039 | 
|  | 3053 3040   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetPaths</span><span class="s">(</span><span class="q">'PathsWithLengthUpto'</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> | 
|  | 3054 3041 <span class="s">}</span> | 
|  | 3055 3042 | 
|  | 3056 3043 <span class="c"># Get a reference to list of paths starting from each vertex in graph with specified</span> | 
|  | 3057 3044 <span class="c"># length and no sharing of edges in paths traversed. By default, cycles are included in paths.</span> | 
|  | 3058 3045 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span> | 
|  | 3059 3046 <span class="c">#</span> | 
|  | 3060 <a name="GetPathsWithLength-"></a>3047 <span class="k">sub </span><span class="m">GetPathsWithLength</span> <span class="s">{</span> | 
|  | 3061 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> | 
|  | 3062 3049 | 
|  | 3063 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> | 
|  | 3064 3051 | 
|  | 3065 3052   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetPaths</span><span class="s">(</span><span class="q">'PathsWithLength'</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> | 
|  | 3066 3053 <span class="s">}</span> | 
|  | 3067 3054 | 
|  | 3068 3055 <span class="c"># Get a reference to list of paths with all possible lengths starting from each vertex</span> | 
|  | 3069 3056 <span class="c"># with no sharing of edges in paths traversed. By default, cycles are included in paths.</span> | 
|  | 3070 3057 <span class="c"># A path containing a cycle is terminated at a vertex completing the cycle.</span> | 
|  | 3071 3058 <span class="c">#</span> | 
|  | 3072 3059 <span class="c">#</span> | 
|  | 3073 <a name="GetPaths-"></a>3060 <span class="k">sub </span><span class="m">GetPaths</span> <span class="s">{</span> | 
|  | 3074 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> | 
|  | 3075 3062 | 
|  | 3076 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> | 
|  | 3077 3064 | 
|  | 3078 3065   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetPaths</span><span class="s">(</span><span class="q">'PathsWithAllLengths'</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> | 
|  | 3079 3066 <span class="s">}</span> | 
|  | 3080 3067 | 
|  | 3081 3068 <span class="c"># Get a reference to list of all paths starting from each vertex in graph with length upto a specified</span> | 
|  | 3082 3069 <span class="c"># length with sharing of edges in paths traversed. By default, cycles are included in paths. A path</span> | 
|  | 3083 3070 <span class="c"># containing a cycle is terminated at a vertex completing the cycle.</span> | 
|  | 3084 3071 <span class="c">#</span> | 
|  | 3085 3072 <span class="c"># Note:</span> | 
|  | 3086 3073 <span class="c">#   . Duplicate paths are not removed.</span> | 
|  | 3087 3074 <span class="c">#</span> | 
|  | 3088 <a name="GetAllPathsWithLengthUpto-"></a>3075 <span class="k">sub </span><span class="m">GetAllPathsWithLengthUpto</span> <span class="s">{</span> | 
|  | 3089 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> | 
|  | 3090 3077 | 
|  | 3091 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> | 
|  | 3092 3079 | 
|  | 3093 3080   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetPaths</span><span class="s">(</span><span class="q">'AllPathsWithLengthUpto'</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> | 
|  | 3094 3081 <span class="s">}</span> | 
|  | 3095 3082 | 
|  | 3096 3083 <span class="c"># Get a reference to list of all paths starting from each vertex in graph with specified</span> | 
|  | 3097 3084 <span class="c"># length with sharing of edges in paths traversed. By default, cycles are included in paths. A path</span> | 
|  | 3098 3085 <span class="c"># containing a cycle is terminated at a vertex completing the cycle.</span> | 
|  | 3099 3086 <span class="c">#</span> | 
|  | 3100 3087 <span class="c"># Note:</span> | 
|  | 3101 3088 <span class="c">#   . Duplicate paths are not removed.</span> | 
|  | 3102 3089 <span class="c">#</span> | 
|  | 3103 <a name="GetAllPathsWithLength-"></a>3090 <span class="k">sub </span><span class="m">GetAllPathsWithLength</span> <span class="s">{</span> | 
|  | 3104 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> | 
|  | 3105 3092 | 
|  | 3106 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> | 
|  | 3107 3094 | 
|  | 3108 3095   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetPaths</span><span class="s">(</span><span class="q">'AllPathsWithLength'</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> | 
|  | 3109 3096 <span class="s">}</span> | 
|  | 3110 3097 | 
|  | 3111 3098 <span class="c"># Get a reference to list of all paths with all possible lengths starting from each vertex in graph</span> | 
|  | 3112 3099 <span class="c"># with sharing of edges in paths traversed. By default, cycles are included in paths. A path</span> | 
|  | 3113 3100 <span class="c"># containing a cycle is terminated at a vertex completing the cycle.</span> | 
|  | 3114 3101 <span class="c">#</span> | 
|  | 3115 3102 <span class="c"># Note:</span> | 
|  | 3116 3103 <span class="c">#   . Duplicate paths are not removed.</span> | 
|  | 3117 3104 <span class="c">#</span> | 
|  | 3118 <a name="GetAllPaths-"></a>3105 <span class="k">sub </span><span class="m">GetAllPaths</span> <span class="s">{</span> | 
|  | 3119 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> | 
|  | 3120 3107 | 
|  | 3121 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> | 
|  | 3122 3109 | 
|  | 3123 3110   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetPaths</span><span class="s">(</span><span class="q">'AllPathsWithAllLengths'</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> | 
|  | 3124 3111 <span class="s">}</span> | 
|  | 3125 3112 | 
|  | 3126 3113 | 
|  | 3127 3114 <span class="c"># Retrieve appropriate paths for each vertex in graph and return a referernce to list</span> | 
|  | 3128 3115 <span class="c"># containing path objects...</span> | 
|  | 3129 3116 <span class="c">#</span> | 
|  | 3130 <a name="_GetPaths-"></a>3117 <span class="k">sub </span><span class="m">_GetPaths</span> <span class="s">{</span> | 
|  | 3131 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> | 
|  | 3132 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> | 
|  | 3133 3120 | 
|  | 3134 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> | 
|  | 3135 3122 | 
|  | 3136 3123   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetVertices</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 3137 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> | 
|  | 3138 3125 | 
|  | 3139 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> | 
|  | 3140 3127     <span class="j">MODE:</span> <span class="s">{</span> | 
|  | 3141 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">->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> | 
|  | 3142 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">->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> | 
|  | 3143 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">->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> | 
|  | 3144 3131 | 
|  | 3145 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">->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> | 
|  | 3146 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">->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> | 
|  | 3147 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">->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> | 
|  | 3148 3135 | 
|  | 3149 3136       <span class="k">return</span> \<span class="i">@EmptyPaths</span><span class="sc">;</span> | 
|  | 3150 3137     <span class="s">}</span> | 
|  | 3151 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> | 
|  | 3152 3139       <span class="k">return</span> \<span class="i">@EmptyPaths</span><span class="sc">;</span> | 
|  | 3153 3140     <span class="s">}</span> | 
|  | 3154 3141     <span class="k">push</span> <span class="i">@Paths</span><span class="cm">,</span> <span class="i">$PathsTraversal</span><span class="i">->GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3155 3142   <span class="s">}</span> | 
|  | 3156 3143   <span class="k">return</span> \<span class="i">@Paths</span><span class="sc">;</span> | 
|  | 3157 3144 <span class="s">}</span> | 
|  | 3158 3145 | 
|  | 3159 3146 <span class="c"># Get a list of paths between two vertices. For cyclic graphs, the list contains</span> | 
|  | 3160 3147 <span class="c"># may contain two paths...</span> | 
|  | 3161 3148 <span class="c">#</span> | 
|  | 3162 <a name="GetPathsBetween-"></a>3149 <span class="k">sub </span><span class="m">GetPathsBetween</span> <span class="s">{</span> | 
|  | 3163 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> | 
|  | 3164 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> | 
|  | 3165 3152 | 
|  | 3166 3153   <span class="i">@Paths</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3167 3154 | 
|  | 3168 3155   <span class="i">$Path</span> = <span class="i">$This</span><span class="i">->_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> | 
|  | 3169 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> | 
|  | 3170 3157     <span class="k">return</span> \<span class="i">@Paths</span><span class="sc">;</span> | 
|  | 3171 3158   <span class="s">}</span> | 
|  | 3172 3159 | 
|  | 3173 3160   <span class="i">$ReversePath</span> = <span class="i">$This</span><span class="i">->_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> | 
|  | 3174 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> | 
|  | 3175 3162     <span class="k">return</span> \<span class="i">@Paths</span><span class="sc">;</span> | 
|  | 3176 3163   <span class="s">}</span> | 
|  | 3177 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> | 
|  | 3178 3165     <span class="k">push</span> <span class="i">@Paths</span><span class="cm">,</span> <span class="i">$Path</span><span class="sc">;</span> | 
|  | 3179 3166   <span class="s">}</span> | 
|  | 3180 3167   <span class="k">else</span> <span class="s">{</span> | 
|  | 3181 3168     <span class="c"># Make sure first vertex in reverse path corresponds to specified start vertex ID...</span> | 
|  | 3182 3169     <span class="i">$ReversePath</span><span class="i">->Reverse</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3183 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">->GetLength</span> <= <span class="i">$ReversePath</span><span class="i">->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> | 
|  | 3184 3171   <span class="s">}</span> | 
|  | 3185 3172   <span class="k">return</span> <span class="i">@Paths</span><span class="sc">;</span> | 
|  | 3186 3173 <span class="s">}</span> | 
|  | 3187 3174 | 
|  | 3188 3175 <span class="c"># Get a path beween two vertices...</span> | 
|  | 3189 3176 <span class="c">#</span> | 
|  | 3190 <a name="_GetPathBetween-"></a>3177 <span class="k">sub </span><span class="m">_GetPathBetween</span> <span class="s">{</span> | 
|  | 3191 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> | 
|  | 3192 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> | 
|  | 3193 3180 | 
|  | 3194 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> | 
|  | 3195 3182   <span class="i">$PathsTraversal</span><span class="i">->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> | 
|  | 3196 3183 | 
|  | 3197 3184   <span class="i">@Paths</span> = <span class="i">$PathsTraversal</span><span class="i">->GetPaths</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3198 3185 | 
|  | 3199 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> | 
|  | 3200 3187 <span class="s">}</span> | 
|  | 3201 3188 | 
|  | 3202 3189 <span class="c"># Get a list containing lists of neighborhood vertices around a specified vertex with in a</span> | 
|  | 3203 3190 <span class="c"># specified radius...</span> | 
|  | 3204 3191 <span class="c">#</span> | 
|  | 3205 <a name="GetNeighborhoodVerticesWithRadiusUpto-"></a>3192 <span class="k">sub </span><span class="m">GetNeighborhoodVerticesWithRadiusUpto</span> <span class="s">{</span> | 
|  | 3206 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> | 
|  | 3207 3194   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3208 3195 | 
|  | 3209 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> | 
|  | 3210 3197   <span class="i">$PathsTraversal</span><span class="i">->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> | 
|  | 3211 3198 | 
|  | 3212 3199   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">->GetVerticesNeighborhoods</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3213 3200 <span class="s">}</span> | 
|  | 3214 3201 | 
|  | 3215 3202 <span class="c"># Get a list containing lists of neighborhood vertices around a specified vertex at all</span> | 
|  | 3216 3203 <span class="c"># radii levels...</span> | 
|  | 3217 3204 <span class="c">#</span> | 
|  | 3218 <a name="GetNeighborhoodVertices-"></a>3205 <span class="k">sub </span><span class="m">GetNeighborhoodVertices</span> <span class="s">{</span> | 
|  | 3219 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> | 
|  | 3220 3207   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3221 3208 | 
|  | 3222 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> | 
|  | 3223 3210   <span class="i">$PathsTraversal</span><span class="i">->PerformNeighborhoodVerticesSearch</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3224 3211 | 
|  | 3225 3212   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">->GetVerticesNeighborhoods</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3226 3213 <span class="s">}</span> | 
|  | 3227 3214 | 
|  | 3228 3215 <span class="c"># Get neighborhood vertices around a specified vertex, along with their successor connected vertices, collected</span> | 
|  | 3229 3216 <span class="c"># with in a specified radius as a list containing references to lists with first value corresponding to vertex</span> | 
|  | 3230 3217 <span class="c"># ID and second value as reference to a list containing its successor connected vertices.</span> | 
|  | 3231 3218 <span class="c">#</span> | 
|  | 3232 3219 <span class="c"># For a neighborhood vertex at each radius level, the successor connected vertices correspond to the</span> | 
|  | 3233 3220 <span class="c"># neighborhood vertices at the next radius level. Consequently, the neighborhood vertices at the last</span> | 
|  | 3234 3221 <span class="c"># radius level don't contain any successor vertices which fall outside the range of specified radius.</span> | 
|  | 3235 3222 <span class="c">#</span> | 
|  | 3236 <a name="GetNeighborhoodVerticesWithSuccessorsAndRadiusUpto-"></a>3223 <span class="k">sub </span><span class="m">GetNeighborhoodVerticesWithSuccessorsAndRadiusUpto</span> <span class="s">{</span> | 
|  | 3237 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> | 
|  | 3238 3225   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3239 3226 | 
|  | 3240 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> | 
|  | 3241 3228   <span class="i">$PathsTraversal</span><span class="i">->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> | 
|  | 3242 3229 | 
|  | 3243 3230   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">->GetVerticesNeighborhoodsWithSuccessors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3244 3231 <span class="s">}</span> | 
|  | 3245 3232 | 
|  | 3246 3233 <span class="c"># Get neighborhood vertices around a specified vertex, along with their successor connected vertices, collected</span> | 
|  | 3247 3234 <span class="c"># at all neighborhood radii as a list containing references to lists with first value corresponding to vertex</span> | 
|  | 3248 3235 <span class="c"># ID and second value as reference to a list containing its successor connected vertices.</span> | 
|  | 3249 3236 <span class="c">#</span> | 
|  | 3250 3237 <span class="c"># For a neighborhood vertex at each radius level, the successor connected vertices correspond to the</span> | 
|  | 3251 3238 <span class="c"># neighborhood vertices at the next radius level. Consequently, the neighborhood vertices at the last</span> | 
|  | 3252 3239 <span class="c"># radius level don't contain any successor vertices which fall outside the range of specified radius.</span> | 
|  | 3253 3240 <span class="c">#</span> | 
|  | 3254 <a name="GetNeighborhoodVerticesWithSuccessors-"></a>3241 <span class="k">sub </span><span class="m">GetNeighborhoodVerticesWithSuccessors</span> <span class="s">{</span> | 
|  | 3255 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> | 
|  | 3256 3243   <span class="k">my</span><span class="s">(</span><span class="i">$PathsTraversal</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3257 3244 | 
|  | 3258 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> | 
|  | 3259 3246   <span class="i">$PathsTraversal</span><span class="i">->PerformNeighborhoodVerticesSearchWithSuccessors</span><span class="s">(</span><span class="i">$StartVertexID</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3260 3247 | 
|  | 3261 3248   <span class="k">return</span> <span class="i">$PathsTraversal</span><span class="i">->GetVerticesNeighborhoodsWithSuccessors</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3262 3249 <span class="s">}</span> | 
|  | 3263 3250 | 
|  | 3264 3251 <span class="c"># Get adjacency matrix for the graph as a Matrix object with row and column indices</span> | 
|  | 3265 3252 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span> | 
|  | 3266 3253 <span class="c">#</span> | 
|  | 3267 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> | 
|  | 3268 3255 <span class="c"># its elements Mij are:</span> | 
|  | 3269 3256 <span class="c">#</span> | 
|  | 3270 3257 <span class="c">#   . 0    if i == j</span> | 
|  | 3271 3258 <span class="c">#   . 1    if i != j and vertex Vi is adjacent to vertex Vj</span> | 
|  | 3272 3259 <span class="c">#   . 0    if i != j and vertex Vi is not adjacent to vertex Vj</span> | 
|  | 3273 3260 <span class="c">#</span> | 
|  | 3274 <a name="GetAdjacencyMatrix-"></a>3261 <span class="k">sub </span><span class="m">GetAdjacencyMatrix</span> <span class="s">{</span> | 
|  | 3275 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> | 
|  | 3276 3263   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3277 3264 | 
|  | 3278 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> | 
|  | 3279 3266   <span class="i">$GraphMatrix</span><span class="i">->GenerateAdjacencyMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3280 3267 | 
|  | 3281 3268   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">->GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3282 3269 <span class="s">}</span> | 
|  | 3283 3270 | 
|  | 3284 3271 <span class="c"># Get Siedel adjacency matrix for the graph as a Matrix object with row and column indices</span> | 
|  | 3285 3272 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span> | 
|  | 3286 3273 <span class="c">#</span> | 
|  | 3287 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> | 
|  | 3288 3275 <span class="c"># its elements Mij are:</span> | 
|  | 3289 3276 <span class="c">#</span> | 
|  | 3290 3277 <span class="c">#   . 0    if i == j</span> | 
|  | 3291 3278 <span class="c">#   . -1   if i != j and vertex Vi is adjacent to vertex Vj</span> | 
|  | 3292 3279 <span class="c">#   . 1    if i != j and vertex Vi is not adjacent to vertex Vj</span> | 
|  | 3293 3280 <span class="c">#</span> | 
|  | 3294 <a name="GetSiedelAdjacencyMatrix-"></a>3281 <span class="k">sub </span><span class="m">GetSiedelAdjacencyMatrix</span> <span class="s">{</span> | 
|  | 3295 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> | 
|  | 3296 3283   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3297 3284 | 
|  | 3298 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> | 
|  | 3299 3286   <span class="i">$GraphMatrix</span><span class="i">->GenerateSiedelAdjacencyMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3300 3287 | 
|  | 3301 3288   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">->GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3302 3289 <span class="s">}</span> | 
|  | 3303 3290 | 
|  | 3304 3291 <span class="c"># Get distance matrix for the graph as a Matrix object with row and column indices</span> | 
|  | 3305 3292 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span> | 
|  | 3306 3293 <span class="c">#</span> | 
|  | 3307 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> | 
|  | 3308 3295 <span class="c"># its elements Mij are:</span> | 
|  | 3309 3296 <span class="c">#</span> | 
|  | 3310 3297 <span class="c">#   . 0    if i == j</span> | 
|  | 3311 3298 <span class="c">#   . d    if i != j and d is the shortest distance between vertex Vi and vertex Vj</span> | 
|  | 3312 3299 <span class="c">#</span> | 
|  | 3313 3300 <span class="c"># Note:</span> | 
|  | 3314 3301 <span class="c">#   . In the final matrix, BigNumber values correspond to vertices with no edges.</span> | 
|  | 3315 3302 <span class="c">#</span> | 
|  | 3316 <a name="GetDistanceMatrix-"></a>3303 <span class="k">sub </span><span class="m">GetDistanceMatrix</span> <span class="s">{</span> | 
|  | 3317 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> | 
|  | 3318 3305   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3319 3306 | 
|  | 3320 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> | 
|  | 3321 3308   <span class="i">$GraphMatrix</span><span class="i">->GenerateDistanceMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3322 3309 | 
|  | 3323 3310   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">->GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3324 3311 <span class="s">}</span> | 
|  | 3325 3312 | 
|  | 3326 3313 <span class="c"># Get incidence matrix for the graph as a Matrix object with row and column indices</span> | 
|  | 3327 3314 <span class="c"># corresponding to graph vertices and edges returned by GetVertices and GetEdges</span> | 
|  | 3328 3315 <span class="c"># methods respectively.</span> | 
|  | 3329 3316 <span class="c">#</span> | 
|  | 3330 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> | 
|  | 3331 3318 <span class="c"># its elements Mij are:</span> | 
|  | 3332 3319 <span class="c">#</span> | 
|  | 3333 3320 <span class="c">#   . 1    if vertex Vi and the edge Ej are incident; in other words, Vi and Ej are related</span> | 
|  | 3334 3321 <span class="c">#   . 0    otherwise</span> | 
|  | 3335 3322 <span class="c">#</span> | 
|  | 3336 <a name="GetIncidenceMatrix-"></a>3323 <span class="k">sub </span><span class="m">GetIncidenceMatrix</span> <span class="s">{</span> | 
|  | 3337 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> | 
|  | 3338 3325   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3339 3326 | 
|  | 3340 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> | 
|  | 3341 3328   <span class="i">$GraphMatrix</span><span class="i">->GenerateIncidenceMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3342 3329 | 
|  | 3343 3330   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">->GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3344 3331 <span class="s">}</span> | 
|  | 3345 3332 | 
|  | 3346 3333 <span class="c"># Get degree matrix for the graph as a Matrix object with row and column indices</span> | 
|  | 3347 3334 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span> | 
|  | 3348 3335 <span class="c">#</span> | 
|  | 3349 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> | 
|  | 3350 3337 <span class="c"># its elements Mij are:</span> | 
|  | 3351 3338 <span class="c">#</span> | 
|  | 3352 3339 <span class="c">#   . deg(Vi)   if i == j and deg(Vi) is the degree of vertex Vi</span> | 
|  | 3353 3340 <span class="c">#   . 0         otherwise</span> | 
|  | 3354 3341 <span class="c">#</span> | 
|  | 3355 <a name="GetDegreeMatrix-"></a>3342 <span class="k">sub </span><span class="m">GetDegreeMatrix</span> <span class="s">{</span> | 
|  | 3356 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> | 
|  | 3357 3344   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3358 3345 | 
|  | 3359 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> | 
|  | 3360 3347   <span class="i">$GraphMatrix</span><span class="i">->GenerateDegreeMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3361 3348 | 
|  | 3362 3349   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">->GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3363 3350 <span class="s">}</span> | 
|  | 3364 3351 | 
|  | 3365 3352 <span class="c"># Get Laplacian matrix for the graph as a Matrix object with row and column indices</span> | 
|  | 3366 3353 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span> | 
|  | 3367 3354 <span class="c">#</span> | 
|  | 3368 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> | 
|  | 3369 3356 <span class="c"># its elements Mij are:</span> | 
|  | 3370 3357 <span class="c">#</span> | 
|  | 3371 3358 <span class="c">#   . deg(Vi)   if i == j and deg(Vi) is the degree of vertex Vi</span> | 
|  | 3372 3359 <span class="c">#   . -1        if i != j and vertex Vi is adjacent to vertex Vj</span> | 
|  | 3373 3360 <span class="c">#   . 0         otherwise</span> | 
|  | 3374 3361 <span class="c">#</span> | 
|  | 3375 3362 <span class="c"># Note: The Laplacian matrix is the difference between the degree matrix and adjacency matrix.</span> | 
|  | 3376 3363 <span class="c">#</span> | 
|  | 3377 <a name="GetLaplacianMatrix-"></a>3364 <span class="k">sub </span><span class="m">GetLaplacianMatrix</span> <span class="s">{</span> | 
|  | 3378 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> | 
|  | 3379 3366   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3380 3367 | 
|  | 3381 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> | 
|  | 3382 3369   <span class="i">$GraphMatrix</span><span class="i">->GenerateLaplacianMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3383 3370 | 
|  | 3384 3371   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">->GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3385 3372 <span class="s">}</span> | 
|  | 3386 3373 | 
|  | 3387 3374 <span class="c"># Get normalized Laplacian matrix for the graph as a Matrix object with row and column indices</span> | 
|  | 3388 3375 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span> | 
|  | 3389 3376 <span class="c">#</span> | 
|  | 3390 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> | 
|  | 3391 3378 <span class="c"># its elements Lij are:</span> | 
|  | 3392 3379 <span class="c">#</span> | 
|  | 3393 3380 <span class="c">#   . 1                           if i == j and deg(Vi) != 0</span> | 
|  | 3394 3381 <span class="c">#   . -1/SQRT(deg(Vi) * deg(Vj))  if i != j and vertex Vi is adjacent to vertex Vj</span> | 
|  | 3395 3382 <span class="c">#   . 0                           otherwise</span> | 
|  | 3396 3383 <span class="c">#</span> | 
|  | 3397 3384 <span class="c">#</span> | 
|  | 3398 <a name="GetNormalizedLaplacianMatrix-"></a>3385 <span class="k">sub </span><span class="m">GetNormalizedLaplacianMatrix</span> <span class="s">{</span> | 
|  | 3399 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> | 
|  | 3400 3387   <span class="k">my</span><span class="s">(</span><span class="i">$GraphMatrix</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3401 3388 | 
|  | 3402 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> | 
|  | 3403 3390   <span class="i">$GraphMatrix</span><span class="i">->GenerateNormalizedLaplacianMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3404 3391 | 
|  | 3405 3392   <span class="k">return</span> <span class="i">$GraphMatrix</span><span class="i">->GetMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3406 3393 <span class="s">}</span> | 
|  | 3407 3394 | 
|  | 3408 3395 <span class="c"># Get admittance matrix for the graph as a Matrix object with row and column indices</span> | 
|  | 3409 3396 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span> | 
|  | 3410 3397 <span class="c">#</span> | 
|  | 3411 <a name="GetAdmittanceMatrix-"></a>3398 <span class="k">sub </span><span class="m">GetAdmittanceMatrix</span> <span class="s">{</span> | 
|  | 3412 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> | 
|  | 3413 3400 | 
|  | 3414 3401   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetLaplacianMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3415 3402 <span class="s">}</span> | 
|  | 3416 3403 | 
|  | 3417 3404 <span class="c"># Get Kirchhoff matrix for the graph as a Matrix object with row and column indices</span> | 
|  | 3418 3405 <span class="c"># corresponding to graph vertices returned by GetVertices method.</span> | 
|  | 3419 3406 <span class="c">#</span> | 
|  | 3420 <a name="GetKirchhoffMatrix-"></a>3407 <span class="k">sub </span><span class="m">GetKirchhoffMatrix</span> <span class="s">{</span> | 
|  | 3421 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> | 
|  | 3422 3409 | 
|  | 3423 3410   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetLaplacianMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 3424 3411 <span class="s">}</span> | 
|  | 3425 3412 | 
|  | 3426 <a name="EOF-"></a></pre> | 
|  | 3427 <p> </p> | 
|  | 3428 <br /> | 
|  | 3429 <center> | 
|  | 3430 <img src="../../../images/h2o2.png"> | 
|  | 3431 </center> | 
|  | 3432 </body> | 
|  | 3433 </html> |