view mayachemtools/docs/modules/html/code/Path.html @ 9:ab29fa5c8c1f draft default tip

Uploaded
author deepakjadmin
date Thu, 15 Dec 2016 14:18:03 -0500
parents 73ae111cf86f
children
line wrap: on
line source

<html>
<head>
<title>MayaChemTools:Code:Graph::Path.pm</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css">
</head>
<body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10">
<br/>
<center>
<a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a>
</center>
<br/>
<pre>
<a name="package-Graph::Path-"></a>   1 <span class="k">package </span><span class="i">Graph::Path</span><span class="sc">;</span>
   2 <span class="c">#</span>
   3 <span class="c"># $RCSfile: Path.pm,v $</span>
   4 <span class="c"># $Date: 2015/02/28 20:49:06 $</span>
   5 <span class="c"># $Revision: 1.25 $</span>
   6 <span class="c">#</span>
   7 <span class="c"># Author: Manish Sud &lt;msud@san.rr.com&gt;</span>
   8 <span class="c">#</span>
   9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span>
  10 <span class="c">#</span>
  11 <span class="c"># This file is part of MayaChemTools.</span>
  12 <span class="c">#</span>
  13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span>
  14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span>
  15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span>
  16 <span class="c"># later version.</span>
  17 <span class="c">#</span>
  18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span>
  19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span>
  20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span>
  21 <span class="c"># details.</span>
  22 <span class="c">#</span>
  23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span>
  24 <span class="c"># along with MayaChemTools; if not, see &lt;http://www.gnu.org/licenses/&gt; or</span>
  25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span>
  26 <span class="c"># Boston, MA, 02111-1307, USA.</span>
  27 <span class="c">#</span>
  28 
  29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
  30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span>
  31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span>
  32 <span class="k">use</span> <span class="w">Storable</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  33 <span class="k">use</span> <span class="w">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  34 
  35 <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>
  36 
  37 <span class="i">@ISA</span> = <span class="q">qw(Exporter)</span><span class="sc">;</span>
  38 <span class="i">@EXPORT</span> = <span class="q">qw()</span><span class="sc">;</span>
  39 <span class="i">@EXPORT_OK</span> = <span class="q">qw()</span><span class="sc">;</span>
  40 
  41 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span><span class="w">all</span>  <span class="cm">=&gt;</span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span><span class="s">)</span><span class="sc">;</span>
  42 
  43 <span class="c"># Setup class variables...</span>
  44 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="cm">,</span> <span class="i">$ObjectID</span><span class="s">)</span><span class="sc">;</span>
  45 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  46 
  47 <span class="c"># Overload Perl functions...</span>
  48 <span class="k">use</span> <span class="w">overload</span> <span class="q">&#39;&quot;&quot;&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;StringifyPath&#39;</span><span class="cm">,</span>
  49 
  50   <span class="q">&#39;==&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_PathEqualOperator&#39;</span><span class="cm">,</span>
  51   <span class="q">&#39;eq&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_PathEqualOperator&#39;</span><span class="cm">,</span>
  52 
  53   <span class="q">&#39;fallback&#39;</span> <span class="cm">=&gt;</span> <span class="k">undef</span><span class="sc">;</span>
  54 
  55 <span class="c"># Class constructor...</span>
<a name="new-"></a>  56 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span>
  57   <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>
  58 
  59   <span class="c"># Initialize object...</span>
  60   <span class="k">my</span> <span class="i">$This</span> = <span class="s">{</span><span class="s">}</span><span class="sc">;</span>
  61   <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>
  62   <span class="i">$This</span><span class="i">-&gt;_InitializePath</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  63 
  64   <span class="k">if</span> <span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span> <span class="i">$This</span><span class="i">-&gt;AddVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span> <span class="s">}</span>
  65 
  66   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
  67 <span class="s">}</span>
  68 
  69 <span class="c"># Initialize object data...</span>
  70 <span class="c">#</span>
<a name="_InitializePath-"></a>  71 <span class="k">sub </span><span class="m">_InitializePath</span> <span class="s">{</span>
  72   <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>
  73 
  74   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  75 <span class="s">}</span>
  76 
  77 <span class="c"># Initialize class ...</span>
<a name="_InitializeClass-"></a>  78 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span>
  79   <span class="c">#Class name...</span>
  80   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span>
  81 <span class="s">}</span>
  82 
  83 <span class="c"># Add a vertex to path after the end vertex...</span>
  84 <span class="c">#</span>
<a name="AddVertex-"></a>  85 <span class="k">sub </span><span class="m">AddVertex</span> <span class="s">{</span>
  86   <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>
  87 
  88   <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>
  89     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddVertex: No vertex added: Vertex ID must be specified...&quot;</span><span class="sc">;</span>
  90     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
  91   <span class="s">}</span>
  92   <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="cm">,</span> <span class="i">$VertexID</span><span class="sc">;</span>
  93 
  94   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
  95 <span class="s">}</span>
  96 
  97 <span class="c"># Add vertices to the path after the end vertex...</span>
  98 <span class="c">#</span>
<a name="AddVertices-"></a>  99 <span class="k">sub </span><span class="m">AddVertices</span> <span class="s">{</span>
 100   <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>
 101 
 102   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
 103     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;AddVertices: No vertices added: Vertices list is empty...&quot;</span><span class="sc">;</span>
 104     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 105   <span class="s">}</span>
 106   <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="cm">,</span> <span class="i">@VertexIDs</span><span class="sc">;</span>
 107 
 108   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 109 <span class="s">}</span>
 110 
 111 <span class="c"># Add a vertex to path after the end vertex...</span>
 112 <span class="c">#</span>
<a name="PushVertex-"></a> 113 <span class="k">sub </span><span class="m">PushVertex</span> <span class="s">{</span>
 114   <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>
 115 
 116   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;AddVertex</span><span class="s">(</span><span class="i">$VertexID</span><span class="s">)</span><span class="sc">;</span>
 117 <span class="s">}</span>
 118 
 119 <span class="c"># Add vertices to the path after the end vertex...</span>
 120 <span class="c">#</span>
<a name="PushVertices-"></a> 121 <span class="k">sub </span><span class="m">PushVertices</span> <span class="s">{</span>
 122   <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 
 124   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;AddVertices</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
 125 <span class="s">}</span>
 126 
 127 <span class="c"># Remove end vertex from path...</span>
 128 <span class="c">#</span>
<a name="PopVertex-"></a> 129 <span class="k">sub </span><span class="m">PopVertex</span> <span class="s">{</span>
 130   <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>
 131 
 132   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="s">)</span> <span class="s">{</span>
 133     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;PopVertex: No vertex removed: Path is empty...&quot;</span><span class="sc">;</span>
 134     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 135   <span class="s">}</span>
 136   <span class="k">pop</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="sc">;</span>
 137 
 138   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 139 <span class="s">}</span>
 140 
 141 <span class="c"># Remove start vertex from path...</span>
 142 <span class="c">#</span>
<a name="ShiftVertex-"></a> 143 <span class="k">sub </span><span class="m">ShiftVertex</span> <span class="s">{</span>
 144   <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>
 145 
 146   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="s">)</span> <span class="s">{</span>
 147     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;ShiftVertex: No vertex removed: Path is empty...&quot;</span><span class="sc">;</span>
 148     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 149   <span class="s">}</span>
 150   <span class="k">shift</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="sc">;</span>
 151 
 152   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 153 <span class="s">}</span>
 154 
 155 <span class="c"># Add a vertex to path before the start vertex...</span>
 156 <span class="c">#</span>
<a name="UnshiftVertex-"></a> 157 <span class="k">sub </span><span class="m">UnshiftVertex</span> <span class="s">{</span>
 158   <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>
 159 
 160   <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>
 161     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;UnshiftVertex: No vertex added: Vertex ID must be specified...&quot;</span><span class="sc">;</span>
 162     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 163   <span class="s">}</span>
 164   <span class="k">unshift</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="cm">,</span> <span class="i">$VertexID</span><span class="sc">;</span>
 165 
 166   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 167 <span class="s">}</span>
 168 
 169 <span class="c"># Add vertices to the path before the start vertex...</span>
 170 <span class="c">#</span>
<a name="UnshiftVertices-"></a> 171 <span class="k">sub </span><span class="m">UnshiftVertices</span> <span class="s">{</span>
 172   <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>
 173 
 174   <span class="k">if</span> <span class="s">(</span>!<span class="i">@VertexIDs</span><span class="s">)</span> <span class="s">{</span>
 175     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;UnshiftVertices: No vertices added: Vertices list is empty...&quot;</span><span class="sc">;</span>
 176     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 177   <span class="s">}</span>
 178   <span class="k">unshift</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="cm">,</span> <span class="i">@VertexIDs</span><span class="sc">;</span>
 179 
 180   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 181 <span class="s">}</span>
 182 
 183 <span class="c"># Get length...</span>
 184 <span class="c">#</span>
<a name="GetLength-"></a> 185 <span class="k">sub </span><span class="m">GetLength</span> <span class="s">{</span>
 186   <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>
 187 
 188   <span class="k">return</span> <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="sc">;</span>
 189 <span class="s">}</span>
 190 
 191 <span class="c"># Get start vertex...</span>
 192 <span class="c">#</span>
<a name="GetStartVertex-"></a> 193 <span class="k">sub </span><span class="m">GetStartVertex</span> <span class="s">{</span>
 194   <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>
 195 
 196   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 197     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 198   <span class="s">}</span>
 199   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="s">)</span> = <span class="n">0</span><span class="sc">;</span>
 200   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetVertex</span><span class="s">(</span><span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 201 <span class="s">}</span>
 202 
 203 <span class="c"># Get end vertex...</span>
 204 <span class="c">#</span>
<a name="GetEndVertex-"></a> 205 <span class="k">sub </span><span class="m">GetEndVertex</span> <span class="s">{</span>
 206   <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>
 207 
 208   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 209     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 210   <span class="s">}</span>
 211   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 212 
 213   <span class="i">$Index</span> = <span class="i">$This</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span> - <span class="n">1</span><span class="sc">;</span>
 214   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetVertex</span><span class="s">(</span><span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 215 <span class="s">}</span>
 216 
 217 <span class="c"># Get start and end vertices...</span>
 218 <span class="c">#</span>
<a name="GetTerminalVertices-"></a> 219 <span class="k">sub </span><span class="m">GetTerminalVertices</span> <span class="s">{</span>
 220   <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>
 221 
 222   <span class="k">return</span> <span class="s">(</span> <span class="i">$This</span><span class="i">-&gt;GetStartVertex</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;GetEndVertex</span><span class="s">(</span><span class="s">)</span> <span class="s">)</span><span class="cm">,</span>
 223 <span class="s">}</span>
 224 
 225 <span class="c"># Get path vertices...</span>
 226 <span class="c">#</span>
<a name="GetVertices-"></a> 227 <span class="k">sub </span><span class="m">GetVertices</span> <span class="s">{</span>
 228   <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>
 229 
 230   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}} <span class="co">:</span> <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="sc">;</span>
 231 <span class="s">}</span>
 232 
 233 <span class="c"># Get a specific vertex from path with indicies starting from 0...</span>
 234 <span class="c">#</span>
<a name="GetVertex-"></a> 235 <span class="k">sub </span><span class="m">GetVertex</span> <span class="s">{</span>
 236   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 237 
 238   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> &lt; <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
 239     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetValue: Index value must be a positive number...&quot;</span><span class="sc">;</span>
 240   <span class="s">}</span>
 241   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> &gt;= <span class="i">$This</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 242     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetValue: Index vaue must be less than length of path...&quot;</span><span class="sc">;</span>
 243   <span class="s">}</span>
 244   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 245     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 246   <span class="s">}</span>
 247   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetVertex</span><span class="s">(</span><span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 248 <span class="s">}</span>
 249 
 250 <span class="c"># Get a vertex...</span>
 251 <span class="c">#</span>
<a name="_GetVertex-"></a> 252 <span class="k">sub </span><span class="m">_GetVertex</span> <span class="s">{</span>
 253   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 254 
 255   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 256 <span class="s">}</span>
 257 
 258 <span class="c"># Get path edges as pair of vertices or number of edges...</span>
 259 <span class="c">#</span>
<a name="GetEdges-"></a> 260 <span class="k">sub </span><span class="m">GetEdges</span> <span class="s">{</span>
 261   <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>
 262 
 263   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetLength</span> &lt; <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
 264     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 265   <span class="s">}</span>
 266   <span class="c"># Set up edges...</span>
 267   <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">@Vertices</span><span class="cm">,</span> <span class="i">@Edges</span><span class="s">)</span><span class="sc">;</span>
 268 
 269   <span class="i">@Edges</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 270   <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">$#</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}} - <span class="n">1</span><span class="s">)</span> <span class="s">)</span> <span class="s">{</span>
 271     <span class="i">$VertexID1</span> = <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 272     <span class="i">$VertexID2</span> = <span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
 273     <span class="k">push</span> <span class="i">@Edges</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>
 274   <span class="s">}</span>
 275 
 276   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@Edges</span> <span class="co">:</span> <span class="s">(</span><span class="s">(</span><span class="k">scalar</span> <span class="i">@Edges</span><span class="s">)</span>/<span class="n">2</span><span class="s">)</span><span class="sc">;</span>
 277 <span class="s">}</span>
 278 
 279 <span class="c"># Is it a cycle?</span>
 280 <span class="c">#</span>
<a name="IsCycle-"></a> 281 <span class="k">sub </span><span class="m">IsCycle</span> <span class="s">{</span>
 282   <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>
 283   <span class="k">my</span><span class="s">(</span><span class="i">$StartVertex</span><span class="cm">,</span> <span class="i">$EndVertex</span><span class="s">)</span><span class="sc">;</span>
 284 
 285   <span class="s">(</span><span class="i">$StartVertex</span><span class="cm">,</span> <span class="i">$EndVertex</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetTerminalVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 286 
 287   <span class="k">return</span> <span class="s">(</span><span class="i">$StartVertex</span> == <span class="i">$EndVertex</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 288 <span class="s">}</span>
 289 
 290 <span class="c"># For a path to be an independent path, it must meet the following conditions:</span>
 291 <span class="c">#   . All other vertices are unique.</span>
 292 <span class="c">#</span>
<a name="IsIndependentPath-"></a> 293 <span class="k">sub </span><span class="m">IsIndependentPath</span> <span class="s">{</span>
 294   <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>
 295 
 296   <span class="c"># Make sure it has at least two vertices...</span>
 297   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span> &lt; <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
 298     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 299   <span class="s">}</span>
 300 
 301   <span class="c"># Check frequency of occurence for non-terminal vertices...</span>
 302   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">$IndependenceStatus</span><span class="cm">,</span> <span class="i">@Vertices</span><span class="cm">,</span> <span class="i">%VerticesMap</span><span class="s">)</span><span class="sc">;</span>
 303 
 304   <span class="i">@Vertices</span> = <span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 305   <span class="k">shift</span> <span class="i">@Vertices</span><span class="sc">;</span> <span class="k">pop</span> <span class="i">@Vertices</span><span class="sc">;</span>
 306 
 307   <span class="i">%VerticesMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 308   <span class="i">$IndependenceStatus</span> = <span class="n">1</span><span class="sc">;</span>
 309 
 310   <span class="j">VERTEXID:</span> <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">@Vertices</span><span class="s">)</span> <span class="s">{</span>
 311     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$VerticesMap</span>{<span class="i">$VertexID</span>} <span class="s">)</span> <span class="s">{</span>
 312       <span class="i">$IndependenceStatus</span> = <span class="n">0</span><span class="sc">;</span>
 313       <span class="k">last</span> <span class="j">VERTEXID</span><span class="sc">;</span>
 314     <span class="s">}</span>
 315     <span class="i">$VerticesMap</span>{<span class="i">$VertexID</span>} = <span class="i">$VertexID</span><span class="sc">;</span>
 316   <span class="s">}</span>
 317   <span class="k">return</span> <span class="i">$IndependenceStatus</span><span class="sc">;</span>
 318 <span class="s">}</span>
 319 
 320 <span class="c"># For a path to be an independent cyclic path, it must meet the following conditions:</span>
 321 <span class="c">#   . Termimal vertices are the same</span>
 322 <span class="c">#   . All other vertices are unique.</span>
 323 <span class="c">#</span>
<a name="IsIndependentCyclicPath-"></a> 324 <span class="k">sub </span><span class="m">IsIndependentCyclicPath</span> <span class="s">{</span>
 325   <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>
 326 
 327   <span class="c"># Make sure it&#39;s a cycle...</span>
 328   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span> &gt;= <span class="n">3</span> &amp;&amp; <span class="i">$This</span><span class="i">-&gt;IsCycle</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 329     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 330   <span class="s">}</span>
 331   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsIndependentPath</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 332 <span class="s">}</span>
 333 
 334 <span class="c"># Is it a path object?</span>
<a name="IsPath-"></a> 335 <span class="k">sub </span><span class="m">IsPath ($)</span> <span class="s">{</span>
 336   <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>
 337 
 338   <span class="k">return</span> <span class="i">_IsPath</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span><span class="sc">;</span>
 339 <span class="s">}</span>
 340 
 341 <span class="c"># Copy path...</span>
 342 <span class="c">#</span>
<a name="Copy-"></a> 343 <span class="k">sub </span><span class="m">Copy</span> <span class="s">{</span>
 344   <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>
 345   <span class="k">my</span><span class="s">(</span><span class="i">$NewPath</span><span class="s">)</span><span class="sc">;</span>
 346 
 347   <span class="i">$NewPath</span> = <span class="i">Storable::dclone</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
 348 
 349   <span class="k">return</span> <span class="i">$NewPath</span><span class="sc">;</span>
 350 <span class="s">}</span>
 351 
 352 <span class="c"># Reverse order of vertices in path...</span>
 353 <span class="c">#</span>
<a name="Reverse-"></a> 354 <span class="k">sub </span><span class="m">Reverse</span> <span class="s">{</span>
 355   <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>
 356   <span class="k">my</span><span class="s">(</span><span class="i">@VertexIDs</span><span class="s">)</span><span class="sc">;</span>
 357 
 358   <span class="i">@VertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="k">push</span> <span class="i">@VertexIDs</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="sc">;</span>
 359 
 360   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="cm">,</span> <span class="k">reverse</span> <span class="i">@VertexIDs</span><span class="sc">;</span>
 361 
 362   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 363 <span class="s">}</span>
 364 
 365 <span class="c"># Get vertices common between two paths...</span>
 366 <span class="c">#</span>
<a name="GetCommonVertices-"></a> 367 <span class="k">sub </span><span class="m">GetCommonVertices</span> <span class="s">{</span>
 368   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 369   <span class="k">my</span><span class="s">(</span><span class="i">$VertexID</span><span class="cm">,</span> <span class="i">@CommonVertices</span><span class="cm">,</span> <span class="i">%OtherVerticesMap</span><span class="s">)</span><span class="sc">;</span>
 370 
 371   <span class="c"># Setup a vertices hash for a quick look up...</span>
 372   <span class="i">%OtherVerticesMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 373   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">$Other</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 374     <span class="i">$OtherVerticesMap</span>{<span class="i">$VertexID</span>} = <span class="i">$VertexID</span><span class="sc">;</span>
 375   <span class="s">}</span>
 376 
 377   <span class="i">@CommonVertices</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 378   <span class="k">for</span> <span class="i">$VertexID</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetVertices</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 379     <span class="k">if</span> <span class="s">(</span><span class="i">$OtherVerticesMap</span>{<span class="i">$VertexID</span>}<span class="s">)</span> <span class="s">{</span>
 380       <span class="k">push</span> <span class="i">@CommonVertices</span><span class="cm">,</span> <span class="i">$VertexID</span>
 381     <span class="s">}</span>
 382   <span class="s">}</span>
 383   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@CommonVertices</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@CommonVertices</span><span class="sc">;</span>
 384 <span class="s">}</span>
 385 
 386 <span class="c"># Join the existing path with a new path specifed using a path object of a list of</span>
 387 <span class="c"># verticies.</span>
 388 <span class="c">#</span>
<a name="Join-"></a> 389 <span class="k">sub </span><span class="m">Join</span> <span class="s">{</span>
 390   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 391 
 392   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_Join</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 393 <span class="s">}</span>
 394 
 395 <span class="c"># Join the existing path with a new path specifed using a path object at a specified</span>
 396 <span class="c"># vertex.</span>
 397 <span class="c">#</span>
<a name="JoinAtVertex-"></a> 398 <span class="k">sub </span><span class="m">JoinAtVertex</span> <span class="s">{</span>
 399   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$CenterVertexID</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 400 
 401   <span class="c"># Make sure CenterVertexID is end vertex in This and start vertex in Other before</span>
 402   <span class="c"># joining them...</span>
 403   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetEndVertex</span><span class="s">(</span><span class="s">)</span> != <span class="i">$CenterVertexID</span><span class="s">)</span> <span class="s">{</span>
 404     <span class="i">$This</span><span class="i">-&gt;Reverse</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 405   <span class="s">}</span>
 406   <span class="k">if</span> <span class="s">(</span><span class="i">$Other</span><span class="i">-&gt;GetStartVertex</span><span class="s">(</span><span class="s">)</span> != <span class="i">$CenterVertexID</span><span class="s">)</span> <span class="s">{</span>
 407     <span class="i">$Other</span><span class="i">-&gt;Reverse</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 408   <span class="s">}</span>
 409   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_Join</span><span class="s">(</span><span class="i">$Other</span><span class="s">)</span><span class="sc">;</span>
 410 <span class="s">}</span>
 411 
 412 <span class="c"># Join the existing path with a new path specifed using a path object of a list of</span>
 413 <span class="c"># verticies.</span>
 414 <span class="c">#</span>
 415 <span class="c"># Notes:</span>
 416 <span class="c">#  . Paths must have a common terminal vertex.</span>
 417 <span class="c">#  . Based on the common terminal vertex found, new path vertices are added to the</span>
 418 <span class="c">#    current path in one of the four ways:</span>
 419 <span class="c">#    . New path at end of current path with same vertices order : EndVertex = NewStartVertex</span>
 420 <span class="c">#    . New path at end of current path with reversed vertices order: EndVertex = NewEndVertex</span>
 421 <span class="c">#    . New path at front of current path with same vertices order: StartVertex = NewEndVertex</span>
 422 <span class="c">#    . New path at front of current path with reversed vertices order: StartVertex = NewStartVertex</span>
 423 <span class="c">#</span>
<a name="_Join-"></a> 424 <span class="k">sub </span><span class="m">_Join</span> <span class="s">{</span>
 425   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 426 
 427   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Values</span><span class="s">)</span> <span class="s">{</span>
 428     <span class="k">return</span><span class="sc">;</span>
 429   <span class="s">}</span>
 430 
 431   <span class="c"># Get a list of new vertex IDs..</span>
 432   <span class="k">my</span><span class="s">(</span><span class="i">$NewPath</span><span class="cm">,</span> <span class="i">$FirstValue</span><span class="cm">,</span> <span class="i">$TypeOfFirstValue</span><span class="cm">,</span> <span class="i">@NewVertexIDs</span><span class="s">)</span><span class="sc">;</span>
 433 
 434   <span class="i">$NewPath</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 435 
 436   <span class="i">@NewVertexIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 437   <span class="i">$FirstValue</span> = <span class="i">$Values</span>[<span class="n">0</span>]<span class="sc">;</span>
 438   <span class="i">$TypeOfFirstValue</span> = <span class="k">ref</span> <span class="i">$FirstValue</span><span class="sc">;</span>
 439   <span class="k">if</span> <span class="s">(</span><span class="i">$TypeOfFirstValue</span> =~ <span class="q">/^(SCALAR|HASH|CODE|REF|GLOB)/</span><span class="s">)</span> <span class="s">{</span>
 440     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;JoinPath: Trying to add vertices to path object with a reference to unsupported value format...&quot;</span><span class="sc">;</span>
 441   <span class="s">}</span>
 442 
 443   <span class="k">if</span> <span class="s">(</span><span class="i">_IsPath</span><span class="s">(</span><span class="i">$FirstValue</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 444     <span class="c"># It&#39;s another path object...</span>
 445     <span class="k">push</span> <span class="i">@NewVertexIDs</span><span class="cm">,</span>  <span class="i">@</span>{<span class="i">$FirstValue</span>-&gt;{<span class="w">Vertices</span>}}<span class="sc">;</span>
 446   <span class="s">}</span>
 447   <span class="k">elsif</span> <span class="s">(</span><span class="i">$TypeOfFirstValue</span> =~ <span class="q">/^ARRAY/</span><span class="s">)</span> <span class="s">{</span>
 448     <span class="c"># It&#39;s array reference...</span>
 449     <span class="k">push</span> <span class="i">@NewVertexIDs</span><span class="cm">,</span>  <span class="i">@</span>{<span class="i">$FirstValue</span>}<span class="sc">;</span>
 450   <span class="s">}</span>
 451   <span class="k">else</span> <span class="s">{</span>
 452     <span class="c"># It&#39;s a list of values...</span>
 453     <span class="k">push</span> <span class="i">@NewVertexIDs</span><span class="cm">,</span>  <span class="i">@Values</span><span class="sc">;</span>
 454   <span class="s">}</span>
 455   <span class="k">my</span><span class="s">(</span><span class="i">$StartVertex</span><span class="cm">,</span> <span class="i">$EndVertex</span><span class="cm">,</span> <span class="i">$NewStartVertex</span><span class="cm">,</span> <span class="i">$NewEndVertex</span><span class="s">)</span><span class="sc">;</span>
 456 
 457   <span class="s">(</span><span class="i">$StartVertex</span><span class="cm">,</span> <span class="i">$EndVertex</span><span class="s">)</span> = <span class="i">$NewPath</span><span class="i">-&gt;GetTerminalVertices</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 458   <span class="s">(</span><span class="i">$NewStartVertex</span><span class="cm">,</span> <span class="i">$NewEndVertex</span><span class="s">)</span> = <span class="s">(</span><span class="i">$NewVertexIDs</span>[<span class="n">0</span>]<span class="cm">,</span> <span class="i">$NewVertexIDs</span>[<span class="i">$#NewVertexIDs</span>]<span class="s">)</span><span class="sc">;</span>
 459 
 460   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$EndVertex</span> == <span class="i">$NewStartVertex</span> || <span class="i">$EndVertex</span> == <span class="i">$NewEndVertex</span> || <span class="i">$StartVertex</span> == <span class="i">$NewEndVertex</span> || <span class="i">$StartVertex</span> == <span class="i">$NewStartVertex</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 461     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;JoinPath: Paths can&#39;t be joined: No common terminal vertex found...&quot;</span><span class="sc">;</span>
 462     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 463   <span class="s">}</span>
 464 
 465   <span class="k">if</span> <span class="s">(</span><span class="i">$EndVertex</span> == <span class="i">$NewStartVertex</span><span class="s">)</span> <span class="s">{</span>
 466     <span class="c"># Take out EndVertex and add new path at the end...</span>
 467     <span class="k">pop</span> <span class="i">@</span>{<span class="i">$NewPath</span>-&gt;{<span class="w">Vertices</span>}}<span class="sc">;</span>
 468     <span class="k">push</span> <span class="i">@</span>{<span class="i">$NewPath</span>-&gt;{<span class="w">Vertices</span>}}<span class="cm">,</span> <span class="i">@NewVertexIDs</span><span class="sc">;</span>
 469   <span class="s">}</span>
 470   <span class="k">elsif</span> <span class="s">(</span><span class="i">$EndVertex</span> == <span class="i">$NewEndVertex</span><span class="s">)</span> <span class="s">{</span>
 471     <span class="c"># Take out EndVertex and add new path at the end with reversed vertex order...</span>
 472     <span class="k">pop</span> <span class="i">@</span>{<span class="i">$NewPath</span>-&gt;{<span class="w">Vertices</span>}}<span class="sc">;</span>
 473     <span class="k">push</span> <span class="i">@</span>{<span class="i">$NewPath</span>-&gt;{<span class="w">Vertices</span>}}<span class="cm">,</span> <span class="k">reverse</span> <span class="i">@NewVertexIDs</span><span class="sc">;</span>
 474   <span class="s">}</span>
 475   <span class="k">elsif</span> <span class="s">(</span><span class="i">$StartVertex</span> == <span class="i">$NewEndVertex</span><span class="s">)</span> <span class="s">{</span>
 476     <span class="c"># Take out NewEndVertex and add new path at the front...</span>
 477     <span class="k">pop</span> <span class="i">@NewVertexIDs</span><span class="sc">;</span>
 478     <span class="k">unshift</span> <span class="i">@</span>{<span class="i">$NewPath</span>-&gt;{<span class="w">Vertices</span>}}<span class="cm">,</span> <span class="i">@NewVertexIDs</span><span class="sc">;</span>
 479   <span class="s">}</span>
 480   <span class="k">elsif</span> <span class="s">(</span><span class="i">$StartVertex</span> == <span class="i">$NewStartVertex</span><span class="s">)</span> <span class="s">{</span>
 481     <span class="c"># Take out NewStartVertex and add new path at the front...</span>
 482     <span class="k">shift</span> <span class="i">@NewVertexIDs</span><span class="sc">;</span>
 483     <span class="k">unshift</span> <span class="i">@</span>{<span class="i">$NewPath</span>-&gt;{<span class="w">Vertices</span>}}<span class="cm">,</span> <span class="k">reverse</span> <span class="i">@NewVertexIDs</span><span class="sc">;</span>
 484   <span class="s">}</span>
 485 
 486   <span class="k">return</span> <span class="i">$NewPath</span><span class="cm">,</span>
 487 <span class="s">}</span>
 488 
 489 <span class="c"># Compare two paths...</span>
 490 <span class="c">#</span>
<a name="_PathEqualOperator-"></a> 491 <span class="k">sub </span><span class="m">_PathEqualOperator</span> <span class="s">{</span>
 492   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 493 
 494   <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">$This</span><span class="s">)</span> &amp;&amp; <span class="i">_IsPath</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$Other</span><span class="s">)</span> &amp;&amp; <span class="i">_IsPath</span><span class="s">(</span><span class="i">$Other</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 495     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_PathEqualOperator: Path equal comparison failed: Both object must be paths...&quot;</span><span class="sc">;</span>
 496   <span class="s">}</span>
 497 
 498   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span> != <span class="i">$Other</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 499     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 500   <span class="s">}</span>
 501   <span class="k">my</span><span class="s">(</span><span class="i">$ThisID</span><span class="cm">,</span> <span class="i">$OtherID</span><span class="cm">,</span> <span class="i">$ReverseOtherID</span><span class="s">)</span><span class="sc">;</span>
 502 
 503   <span class="i">$ThisID</span> = <span class="k">join</span><span class="s">(</span><span class="q">&#39;-&#39;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="s">)</span><span class="sc">;</span>
 504   <span class="i">$OtherID</span> = <span class="k">join</span><span class="s">(</span><span class="q">&#39;-&#39;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$Other</span>-&gt;{<span class="w">Vertices</span>}}<span class="s">)</span><span class="sc">;</span>
 505   <span class="i">$ReverseOtherID</span> = <span class="k">join</span><span class="s">(</span><span class="q">&#39;-&#39;</span><span class="cm">,</span> <span class="k">reverse</span><span class="s">(</span><span class="i">@</span>{<span class="i">$Other</span>-&gt;{<span class="w">Vertices</span>}}<span class="s">)</span><span class="s">)</span><span class="sc">;</span>
 506 
 507   <span class="k">return</span> <span class="s">(</span><span class="i">$ThisID</span> =~ <span class="q">/^($OtherID|$ReverseOtherID)$/</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 508 <span class="s">}</span>
 509 
 510 <span class="c"># Return a string containing vertices in the path...</span>
<a name="StringifyPath-"></a> 511 <span class="k">sub </span><span class="m">StringifyPath</span> <span class="s">{</span>
 512   <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>
 513   <span class="k">my</span><span class="s">(</span><span class="i">$PathString</span><span class="s">)</span><span class="sc">;</span>
 514 
 515   <span class="i">$PathString</span> = <span class="q">&quot;Path: &quot;</span> . <span class="k">join</span><span class="s">(</span><span class="q">&#39;-&#39;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Vertices</span>}}<span class="s">)</span><span class="sc">;</span>
 516 
 517   <span class="k">return</span> <span class="i">$PathString</span><span class="sc">;</span>
 518 <span class="s">}</span>
 519 
 520 <span class="c"># Is it a path object?</span>
<a name="_IsPath-"></a> 521 <span class="k">sub </span><span class="m">_IsPath</span> <span class="s">{</span>
 522   <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>
 523 
 524   <span class="k">return</span> <span class="s">(</span><span class="i">Scalar::Util::blessed</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> &amp;&amp; <span class="i">$Object</span><span class="i">-&gt;isa</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 525 <span class="s">}</span>
 526 
<a name="EOF-"></a></pre>
<p>&nbsp;</p>
<br />
<center>
<img src="../../../images/h2o2.png">
</center>
</body>
</html>