view mayachemtools/docs/modules/html/code/FingerprintsVector.html @ 0:73ae111cf86f draft

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 11:55:01 -0500
parents
children
line wrap: on
line source

<html>
<head>
<title>MayaChemTools:Code:Fingerprints::FingerprintsVector.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-Fingerprints::FingerprintsVector-"></a>   1 <span class="k">package </span><span class="i">Fingerprints::FingerprintsVector</span><span class="sc">;</span>
   2 <span class="c">#</span>
   3 <span class="c"># $RCSfile: FingerprintsVector.pm,v $</span>
   4 <span class="c"># $Date: 2015/02/28 20:48:54 $</span>
   5 <span class="c"># $Revision: 1.31 $</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">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  33 <span class="k">use</span> <span class="w">MathUtil</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  34 <span class="k">use</span> <span class="w">TextUtil</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  35 <span class="k">use</span> <span class="w">StatisticsUtil</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  36 <span class="k">use</span> <span class="w">BitVector</span><span class="sc">;</span>
  37 <span class="k">use</span> <span class="w">Vector</span><span class="sc">;</span>
  38 
  39 <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>
  40 
  41 <span class="i">@ISA</span> = <span class="q">qw(Exporter)</span><span class="sc">;</span>
  42 
  43 <span class="c"># Distance coefficients</span>
  44 <span class="k">my</span><span class="s">(</span><span class="i">@DistanceCoefficients</span><span class="s">)</span> = <span class="q">qw(CityBlockDistanceCoefficient EuclideanDistanceCoefficient HammingDistanceCoefficient ManhattanDistanceCoefficient SoergelDistanceCoefficient)</span><span class="sc">;</span>
  45 
  46 <span class="c"># Similarity coefficients...</span>
  47 <span class="k">my</span><span class="s">(</span><span class="i">@SimilarityCoefficients</span><span class="s">)</span> = <span class="q">qw(CosineSimilarityCoefficient CzekanowskiSimilarityCoefficient DiceSimilarityCoefficient OchiaiSimilarityCoefficient JaccardSimilarityCoefficient SorensonSimilarityCoefficient TanimotoSimilarityCoefficient)</span><span class="sc">;</span>
  48 
  49 <span class="c"># New from string...</span>
  50 <span class="k">my</span><span class="s">(</span><span class="i">@NewFromString</span><span class="s">)</span> = <span class="q">qw(NewFromValuesString NewFromValuesAndIDsString NewFromIDsAndValuesString NewFromValuesAndIDsPairsString NewFromIDsAndValuesPairsString)</span><span class="sc">;</span>
  51 
  52 <span class="i">@EXPORT</span> = <span class="q">qw(IsFingerprintsVector)</span><span class="sc">;</span>
  53 <span class="i">@EXPORT_OK</span> = <span class="q">qw(GetSupportedDistanceCoefficients GetSupportedSimilarityCoefficients GetSupportedDistanceAndSimilarityCoefficients @DistanceCoefficients @SimilarityCoefficients)</span><span class="sc">;</span>
  54 
  55 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span>
  56                 <span class="w">new</span> <span class="cm">=&gt;</span> <span class="s">[</span><span class="i">@NewFromString</span><span class="s">]</span><span class="cm">,</span>
  57                 <span class="w">distancecoefficients</span> <span class="cm">=&gt;</span> <span class="s">[</span><span class="i">@DistanceCoefficients</span><span class="s">]</span><span class="cm">,</span>
  58                 <span class="w">similaritycoefficients</span> <span class="cm">=&gt;</span> <span class="s">[</span><span class="i">@SimilarityCoefficients</span><span class="s">]</span><span class="cm">,</span>
  59                 <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>
  60                <span class="s">)</span><span class="sc">;</span>
  61 
  62 <span class="c"># Setup class variables...</span>
  63 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="sc">;</span>
  64 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  65 
  66 <span class="c"># Overload Perl functions...</span>
  67 <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;StringifyFingerprintsVector&#39;</span><span class="sc">;</span>
  68 
  69 <span class="c"># Class constructor...</span>
<a name="new-"></a>  70 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span>
  71   <span class="k">my</span><span class="s">(</span><span class="i">$Class</span><span class="cm">,</span> <span class="i">%NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
  72 
  73   <span class="c"># Initialize object...</span>
  74   <span class="k">my</span> <span class="i">$This</span> = <span class="s">{</span><span class="s">}</span><span class="sc">;</span>
  75   <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>
  76 
  77   <span class="i">$This</span><span class="i">-&gt;_InitializeFingerprintsVector</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  78 
  79   <span class="i">$This</span><span class="i">-&gt;_InitializeFingerprintsVectorProperties</span><span class="s">(</span><span class="i">%NamesAndValues</span><span class="s">)</span><span class="sc">;</span>
  80 
  81   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
  82 <span class="s">}</span>
  83 
  84 <span class="c"># Initialize object data...</span>
  85 <span class="c">#</span>
<a name="_InitializeFingerprintsVector-"></a>  86 <span class="k">sub </span><span class="m">_InitializeFingerprintsVector</span> <span class="s">{</span>
  87   <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>
  88 
  89   <span class="c"># Type of fingerprint vector...</span>
  90   <span class="i">$This</span>-&gt;{<span class="w">Type</span>} = <span class="q">&#39;&#39;</span><span class="sc">;</span>
  91 
  92   <span class="c"># Fingerprint vector values...</span>
  93   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  94 
  95   <span class="c"># Fingerprint vector value IDs...</span>
  96   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  97 
  98   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
  99 <span class="s">}</span>
 100 
 101 <span class="c"># Initialize class ...</span>
<a name="_InitializeClass-"></a> 102 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span>
 103   <span class="c">#Class name...</span>
 104   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span>
 105 <span class="s">}</span>
 106 
 107 <span class="c"># Initialize object properties....</span>
<a name="_InitializeFingerprintsVectorProperties-"></a> 108 <span class="k">sub </span><span class="m">_InitializeFingerprintsVectorProperties</span> <span class="s">{</span>
 109   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">%NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 110 
 111   <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">$MethodName</span><span class="s">)</span><span class="sc">;</span>
 112   <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>
 113     <span class="i">$MethodName</span> = <span class="q">&quot;Set${Name}&quot;</span><span class="sc">;</span>
 114     <span class="i">$This</span><span class="i">-&gt;$MethodName</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 115   <span class="s">}</span>
 116 
 117   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$NamesAndValues</span>{<span class="w">Type</span>}<span class="s">)</span> <span class="s">{</span>
 118     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;New: Object can&#39;t be instantiated without specifying type...&quot;</span><span class="sc">;</span>
 119   <span class="s">}</span>
 120   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 121 <span class="s">}</span>
 122 
 123 <span class="c"># Create a new fingerprints vector using space delimited values string. This functionality can be</span>
 124 <span class="c"># either invoked as a class function or an object method.</span>
 125 <span class="c">#</span>
<a name="NewFromValuesString-"></a> 126 <span class="k">sub </span><span class="m">NewFromValuesString ($$;$)</span> <span class="s">{</span>
 127   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParamater</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 128   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$ValuesString</span><span class="s">)</span><span class="sc">;</span>
 129 
 130   <span class="k">if</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 131     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$ValuesString</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParamater</span><span class="s">)</span><span class="sc">;</span>
 132   <span class="s">}</span>
 133   <span class="k">else</span> <span class="s">{</span>
 134     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$ValuesString</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
 135   <span class="s">}</span>
 136   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVector</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 137 
 138   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 139   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$ValuesString</span><span class="s">)</span> &amp;&amp; <span class="k">length</span><span class="s">(</span><span class="i">$ValuesString</span><span class="s">)</span> &amp;&amp; <span class="i">$ValuesString</span> !~ <span class="q">/^None$/i</span><span class="s">)</span> <span class="s">{</span>
 140     <span class="i">@Values</span> = <span class="k">split</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">$ValuesString</span><span class="s">)</span><span class="sc">;</span>
 141   <span class="s">}</span>
 142 
 143   <span class="i">$FingerprintsVector</span> = <span class="i">new</span> <span class="i">Fingerprints::FingerprintsVector</span><span class="s">(</span><span class="q">&#39;Type&#39;</span> <span class="cm">=&gt;</span> <span class="i">$Type</span><span class="cm">,</span> <span class="q">&#39;Values&#39;</span> <span class="cm">=&gt;</span> \<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 144 
 145   <span class="k">return</span> <span class="i">$FingerprintsVector</span><span class="sc">;</span>
 146 <span class="s">}</span>
 147 
 148 <span class="c"># Create a new fingerprints vector using values and IDs string containing semicolon</span>
 149 <span class="c"># delimited value string and value IDs strings. The values within value and value IDs</span>
 150 <span class="c"># string are delimited by spaces.</span>
 151 <span class="c">#</span>
 152 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
 153 <span class="c">#</span>
<a name="NewFromValuesAndIDsString-"></a> 154 <span class="k">sub </span><span class="m">NewFromValuesAndIDsString ($$;$)</span> <span class="s">{</span>
 155   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParamater</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 156   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$ValuesAndIDsString</span><span class="s">)</span><span class="sc">;</span>
 157 
 158   <span class="k">if</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 159     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$ValuesAndIDsString</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParamater</span><span class="s">)</span><span class="sc">;</span>
 160   <span class="s">}</span>
 161   <span class="k">else</span> <span class="s">{</span>
 162     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$ValuesAndIDsString</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
 163   <span class="s">}</span>
 164   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVector</span><span class="cm">,</span> <span class="i">$ValuesString</span><span class="cm">,</span> <span class="i">$ValueIDsString</span><span class="cm">,</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">@ValueIDs</span><span class="s">)</span><span class="sc">;</span>
 165 
 166   <span class="s">(</span><span class="i">$ValuesString</span><span class="cm">,</span> <span class="i">$ValueIDsString</span><span class="s">)</span> = <span class="k">split</span><span class="s">(</span><span class="q">&#39;;&#39;</span><span class="cm">,</span> <span class="i">$ValuesAndIDsString</span><span class="s">)</span><span class="sc">;</span>
 167 
 168   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 169   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$ValuesString</span><span class="s">)</span> &amp;&amp; <span class="k">length</span><span class="s">(</span><span class="i">$ValuesString</span><span class="s">)</span> &amp;&amp; <span class="i">$ValuesString</span> !~ <span class="q">/^None$/i</span><span class="s">)</span> <span class="s">{</span>
 170     <span class="i">@Values</span> = <span class="k">split</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">$ValuesString</span><span class="s">)</span><span class="sc">;</span>
 171   <span class="s">}</span>
 172   <span class="i">@ValueIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 173   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$ValueIDsString</span><span class="s">)</span> &amp;&amp; <span class="k">length</span><span class="s">(</span><span class="i">$ValueIDsString</span><span class="s">)</span> &amp;&amp; <span class="i">$ValueIDsString</span> !~ <span class="q">/^None$/i</span><span class="s">)</span> <span class="s">{</span>
 174     <span class="i">@ValueIDs</span> = <span class="k">split</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">$ValueIDsString</span><span class="s">)</span><span class="sc">;</span>
 175   <span class="s">}</span>
 176 
 177   <span class="k">if</span> <span class="s">(</span><span class="i">@Values</span> != <span class="i">@ValueIDs</span> <span class="s">)</span> <span class="s">{</span>
 178     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;NewFromValuesAndIDsString: Object can&#39;t be instantiated: Number specified values, &quot;</span> . <span class="k">scalar</span> <span class="i">@Values</span> . <span class="q">&quot;, must be equal to number of specified value IDs, &quot;</span> . <span class="k">scalar</span> <span class="i">@ValueIDs</span> .  <span class="q">&quot;...&quot;</span><span class="sc">;</span>
 179     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 180   <span class="s">}</span>
 181 
 182   <span class="i">$FingerprintsVector</span> = <span class="i">new</span> <span class="i">Fingerprints::FingerprintsVector</span><span class="s">(</span><span class="q">&#39;Type&#39;</span> <span class="cm">=&gt;</span> <span class="i">$Type</span><span class="cm">,</span> <span class="q">&#39;Values&#39;</span> <span class="cm">=&gt;</span> \<span class="i">@Values</span><span class="cm">,</span> <span class="q">&#39;ValueIDs&#39;</span> <span class="cm">=&gt;</span> \<span class="i">@ValueIDs</span><span class="s">)</span><span class="sc">;</span>
 183 
 184   <span class="k">return</span> <span class="i">$FingerprintsVector</span><span class="sc">;</span>
 185 <span class="s">}</span>
 186 
 187 <span class="c"># Create a new fingerprints vector using IDs and values string containing semicolon</span>
 188 <span class="c"># delimited value IDs string and values strings. The values within value and value IDs</span>
 189 <span class="c"># string are delimited by spaces.</span>
 190 <span class="c">#</span>
 191 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
 192 <span class="c">#</span>
<a name="NewFromIDsAndValuesString-"></a> 193 <span class="k">sub </span><span class="m">NewFromIDsAndValuesString ($$;$)</span> <span class="s">{</span>
 194   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParamater</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 195   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$IDsAndValuesString</span><span class="s">)</span><span class="sc">;</span>
 196 
 197   <span class="k">if</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 198     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$IDsAndValuesString</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParamater</span><span class="s">)</span><span class="sc">;</span>
 199   <span class="s">}</span>
 200   <span class="k">else</span> <span class="s">{</span>
 201     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$IDsAndValuesString</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
 202   <span class="s">}</span>
 203   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVector</span><span class="cm">,</span> <span class="i">$ValuesString</span><span class="cm">,</span> <span class="i">$ValueIDsString</span><span class="cm">,</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">@ValueIDs</span><span class="s">)</span><span class="sc">;</span>
 204 
 205   <span class="s">(</span><span class="i">$ValueIDsString</span><span class="cm">,</span> <span class="i">$ValuesString</span><span class="s">)</span> = <span class="k">split</span><span class="s">(</span><span class="q">&#39;;&#39;</span><span class="cm">,</span> <span class="i">$IDsAndValuesString</span><span class="s">)</span><span class="sc">;</span>
 206 
 207   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 208   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$ValuesString</span><span class="s">)</span> &amp;&amp; <span class="k">length</span><span class="s">(</span><span class="i">$ValuesString</span><span class="s">)</span> &amp;&amp; <span class="i">$ValuesString</span> !~ <span class="q">/^None$/i</span><span class="s">)</span> <span class="s">{</span>
 209     <span class="i">@Values</span> = <span class="k">split</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">$ValuesString</span><span class="s">)</span><span class="sc">;</span>
 210   <span class="s">}</span>
 211   <span class="i">@ValueIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 212   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$ValueIDsString</span><span class="s">)</span> &amp;&amp; <span class="k">length</span><span class="s">(</span><span class="i">$ValueIDsString</span><span class="s">)</span> &amp;&amp; <span class="i">$ValueIDsString</span> !~ <span class="q">/^None$/i</span><span class="s">)</span> <span class="s">{</span>
 213     <span class="i">@ValueIDs</span> = <span class="k">split</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">$ValueIDsString</span><span class="s">)</span><span class="sc">;</span>
 214   <span class="s">}</span>
 215 
 216   <span class="k">if</span> <span class="s">(</span><span class="i">@Values</span> != <span class="i">@ValueIDs</span> <span class="s">)</span> <span class="s">{</span>
 217     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;NewFromIDsAndValuesString: Object can&#39;t be instantiated: Number specified values, &quot;</span> . <span class="k">scalar</span> <span class="i">@Values</span> . <span class="q">&quot;, must be equal to number of specified value IDs, &quot;</span> . <span class="k">scalar</span> <span class="i">@ValueIDs</span> .  <span class="q">&quot;...&quot;</span><span class="sc">;</span>
 218     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 219   <span class="s">}</span>
 220 
 221   <span class="i">$FingerprintsVector</span> = <span class="i">new</span> <span class="i">Fingerprints::FingerprintsVector</span><span class="s">(</span><span class="q">&#39;Type&#39;</span> <span class="cm">=&gt;</span> <span class="i">$Type</span><span class="cm">,</span> <span class="q">&#39;Values&#39;</span> <span class="cm">=&gt;</span> \<span class="i">@Values</span><span class="cm">,</span> <span class="q">&#39;ValueIDs&#39;</span> <span class="cm">=&gt;</span> \<span class="i">@ValueIDs</span><span class="s">)</span><span class="sc">;</span>
 222 
 223   <span class="k">return</span> <span class="i">$FingerprintsVector</span><span class="sc">;</span>
 224 <span class="s">}</span>
 225 
 226 <span class="c"># Create a new fingerprints vector using values and IDs pairs string containing space</span>
 227 <span class="c"># value and value IDs pairs.</span>
 228 <span class="c">#</span>
 229 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
 230 <span class="c">#</span>
<a name="NewFromValuesAndIDsPairsString-"></a> 231 <span class="k">sub </span><span class="m">NewFromValuesAndIDsPairsString ($$;$)</span> <span class="s">{</span>
 232   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParamater</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 233   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$ValuesAndIDsPairsString</span><span class="s">)</span><span class="sc">;</span>
 234 
 235   <span class="k">if</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 236     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$ValuesAndIDsPairsString</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParamater</span><span class="s">)</span><span class="sc">;</span>
 237   <span class="s">}</span>
 238   <span class="k">else</span> <span class="s">{</span>
 239     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$ValuesAndIDsPairsString</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
 240   <span class="s">}</span>
 241   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVector</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">@ValueIDs</span><span class="cm">,</span> <span class="i">@ValuesAndIDsPairs</span><span class="s">)</span><span class="sc">;</span>
 242 
 243   <span class="i">@ValuesAndIDsPairs</span> = <span class="k">split</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">$ValuesAndIDsPairsString</span><span class="s">)</span><span class="sc">;</span>
 244   <span class="k">if</span> <span class="s">(</span><span class="i">@ValuesAndIDsPairs</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
 245     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}-&gt;NewFromValuesAndIDsPairsString: No fingerprint vector created: Invalid values and IDs pairs data: Input list must contain even number of values and IDs pairs...&quot;</span><span class="sc">;</span>
 246     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 247   <span class="s">}</span>
 248 
 249   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@ValueIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 250   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">@ValuesAndIDsPairs</span> == <span class="n">2</span> &amp;&amp; <span class="i">$ValuesAndIDsPairs</span>[<span class="n">0</span>] =~ <span class="q">/^None$/i</span> &amp;&amp; <span class="i">$ValuesAndIDsPairs</span>[<span class="n">1</span>] =~ <span class="q">/^None$/i</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 251     <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#ValuesAndIDsPairs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
 252       <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$ValuesAndIDsPairs</span>[<span class="i">$Index</span>]<span class="sc">;</span>
 253       <span class="k">push</span> <span class="i">@ValueIDs</span><span class="cm">,</span> <span class="i">$ValuesAndIDsPairs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
 254     <span class="s">}</span>
 255   <span class="s">}</span>
 256   <span class="i">$FingerprintsVector</span> = <span class="i">new</span> <span class="i">Fingerprints::FingerprintsVector</span><span class="s">(</span><span class="q">&#39;Type&#39;</span> <span class="cm">=&gt;</span> <span class="i">$Type</span><span class="cm">,</span> <span class="q">&#39;Values&#39;</span> <span class="cm">=&gt;</span> \<span class="i">@Values</span><span class="cm">,</span> <span class="q">&#39;ValueIDs&#39;</span> <span class="cm">=&gt;</span> \<span class="i">@ValueIDs</span><span class="s">)</span><span class="sc">;</span>
 257 
 258   <span class="k">return</span> <span class="i">$FingerprintsVector</span><span class="sc">;</span>
 259 <span class="s">}</span>
 260 
 261 <span class="c"># Create a new fingerprints vector using IDs and values pairs string containing space</span>
 262 <span class="c"># value IDs and valus pairs.</span>
 263 <span class="c">#</span>
 264 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
 265 <span class="c">#</span>
<a name="NewFromIDsAndValuesPairsString-"></a> 266 <span class="k">sub </span><span class="m">NewFromIDsAndValuesPairsString ($$;$)</span> <span class="s">{</span>
 267   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParamater</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 268   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$IDsAndValuesPairsString</span><span class="s">)</span><span class="sc">;</span>
 269 
 270   <span class="k">if</span> <span class="s">(</span><span class="i">@_</span> == <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 271     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$IDsAndValuesPairsString</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParamater</span><span class="s">)</span><span class="sc">;</span>
 272   <span class="s">}</span>
 273   <span class="k">else</span> <span class="s">{</span>
 274     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="cm">,</span> <span class="i">$IDsAndValuesPairsString</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
 275   <span class="s">}</span>
 276   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVector</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">@ValueIDs</span><span class="cm">,</span> <span class="i">@IDsAndValuesPairs</span><span class="s">)</span><span class="sc">;</span>
 277 
 278   <span class="i">@IDsAndValuesPairs</span> = <span class="k">split</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">$IDsAndValuesPairsString</span><span class="s">)</span><span class="sc">;</span>
 279   <span class="k">if</span> <span class="s">(</span><span class="i">@IDsAndValuesPairs</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
 280     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;NewFromIDsAndValuesPairsString: No fingerprint vector created: Invalid values and IDs pairs data: Input list must contain even number of values and IDs pairs...&quot;</span><span class="sc">;</span>
 281     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 282   <span class="s">}</span>
 283 
 284   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">@ValueIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 285   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">@IDsAndValuesPairs</span> == <span class="n">2</span> &amp;&amp; <span class="i">$IDsAndValuesPairs</span>[<span class="n">0</span>] =~ <span class="q">/^None$/i</span> &amp;&amp; <span class="i">$IDsAndValuesPairs</span>[<span class="n">1</span>] =~ <span class="q">/^None$/i</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 286     <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> &lt; <span class="i">$#IDsAndValuesPairs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span>
 287       <span class="k">push</span> <span class="i">@ValueIDs</span><span class="cm">,</span> <span class="i">$IDsAndValuesPairs</span>[<span class="i">$Index</span>]<span class="sc">;</span>
 288       <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$IDsAndValuesPairs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span>
 289     <span class="s">}</span>
 290   <span class="s">}</span>
 291   <span class="i">$FingerprintsVector</span> = <span class="i">new</span> <span class="i">Fingerprints::FingerprintsVector</span><span class="s">(</span><span class="q">&#39;Type&#39;</span> <span class="cm">=&gt;</span> <span class="i">$Type</span><span class="cm">,</span> <span class="q">&#39;Values&#39;</span> <span class="cm">=&gt;</span> \<span class="i">@Values</span><span class="cm">,</span> <span class="q">&#39;ValueIDs&#39;</span> <span class="cm">=&gt;</span> \<span class="i">@ValueIDs</span><span class="s">)</span><span class="sc">;</span>
 292 
 293   <span class="k">return</span> <span class="i">$FingerprintsVector</span><span class="sc">;</span>
 294 <span class="s">}</span>
 295 
 296 <span class="c"># Set type of fingerprint vector. Supported types are: OrderedNumericalValues, NumericalValues, and</span>
 297 <span class="c"># AlphaNumericalValues</span>
 298 <span class="c">#</span>
 299 <span class="c">#  .  For OrderedNumericalValues type, both vectors must be of the same size and contain similar</span>
 300 <span class="c">#     types of numerical values in the same order.</span>
 301 <span class="c">#</span>
 302 <span class="c">#  .  For NumericalValues type, vector value IDs for both vectors must be specified; however, their</span>
 303 <span class="c">#     size and order of IDs and numerical values may be different. For each vector, value IDs must</span>
 304 <span class="c">#     correspond to vector values.</span>
 305 <span class="c">#</span>
 306 <span class="c">#  .  For AlphaNumericalValues type, vectors may contain both numerical and alphanumerical values</span>
 307 <span class="c">#     and their sizes may be different.</span>
 308 <span class="c">#</span>
<a name="SetType-"></a> 309 <span class="k">sub </span><span class="m">SetType</span> <span class="s">{</span>
 310   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 311 
 312   <span class="k">if</span> <span class="s">(</span><span class="i">$Type</span> !~ <span class="q">/^(OrderedNumericalValues|NumericalValues|AlphaNumericalValues)$/i</span><span class="s">)</span> <span class="s">{</span>
 313     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetType: Specified value, $Type, for Type is not vaild. Supported types in current release of MayaChemTools: OrderedNumericalValues, NumericalValues or AlphaNumericalValues&quot;</span><span class="sc">;</span>
 314   <span class="s">}</span>
 315 
 316   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Type</span>}<span class="s">)</span> <span class="s">{</span>
 317     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetType: Can&#39;t change intial fingerprints vector type:  It&#39;s already set...&quot;</span><span class="sc">;</span>
 318   <span class="s">}</span>
 319   <span class="i">$This</span>-&gt;{<span class="w">Type</span>} = <span class="i">$Type</span><span class="sc">;</span>
 320 
 321   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 322 <span class="s">}</span>
 323 
 324 <span class="c"># Get fingerpints vector type...</span>
 325 <span class="c">#</span>
<a name="GetType-"></a> 326 <span class="k">sub </span><span class="m">GetType</span> <span class="s">{</span>
 327   <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>
 328 
 329   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">Type</span>}<span class="sc">;</span>
 330 <span class="s">}</span>
 331 
 332 <span class="c"># Set ID...</span>
<a name="SetID-"></a> 333 <span class="k">sub </span><span class="m">SetID</span> <span class="s">{</span>
 334   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 335 
 336   <span class="i">$This</span>-&gt;{<span class="w">ID</span>} = <span class="i">$Value</span><span class="sc">;</span>
 337 
 338   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 339 <span class="s">}</span>
 340 
 341 <span class="c"># Get ID...</span>
<a name="GetID-"></a> 342 <span class="k">sub </span><span class="m">GetID</span> <span class="s">{</span>
 343   <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>
 344 
 345   <span class="k">return</span> <span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">ID</span>} ? <span class="i">$This</span>-&gt;{<span class="w">ID</span>} <span class="co">:</span> <span class="q">&#39;None&#39;</span><span class="sc">;</span>
 346 <span class="s">}</span>
 347 
 348 <span class="c"># Set description...</span>
<a name="SetDescription-"></a> 349 <span class="k">sub </span><span class="m">SetDescription</span> <span class="s">{</span>
 350   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 351 
 352   <span class="i">$This</span>-&gt;{<span class="w">Description</span>} = <span class="i">$Value</span><span class="sc">;</span>
 353 
 354   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 355 <span class="s">}</span>
 356 
 357 <span class="c"># Get description...</span>
<a name="GetDescription-"></a> 358 <span class="k">sub </span><span class="m">GetDescription</span> <span class="s">{</span>
 359   <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>
 360 
 361   <span class="k">return</span> <span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">Description</span>} ? <span class="i">$This</span>-&gt;{<span class="w">Description</span>} <span class="co">:</span> <span class="q">&#39;No description available&#39;</span><span class="sc">;</span>
 362 <span class="s">}</span>
 363 
 364 <span class="c"># Set vector type...</span>
<a name="SetVectorType-"></a> 365 <span class="k">sub </span><span class="m">SetVectorType</span> <span class="s">{</span>
 366   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 367 
 368   <span class="i">$This</span>-&gt;{<span class="w">VectorType</span>} = <span class="i">$Value</span><span class="sc">;</span>
 369 
 370   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 371 <span class="s">}</span>
 372 
 373 <span class="c"># Get vector type...</span>
<a name="GetVectorType-"></a> 374 <span class="k">sub </span><span class="m">GetVectorType</span> <span class="s">{</span>
 375   <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>
 376 
 377   <span class="k">return</span> <span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">VectorType</span>} ? <span class="i">$This</span>-&gt;{<span class="w">VectorType</span>} <span class="co">:</span> <span class="q">&#39;FingerprintsVector&#39;</span><span class="sc">;</span>
 378 <span class="s">}</span>
 379 
 380 <span class="c"># Set values of a fingerprint vector using a vector, reference to an array or an array...</span>
 381 <span class="c">#</span>
<a name="SetValues-"></a> 382 <span class="k">sub </span><span class="m">SetValues</span> <span class="s">{</span>
 383   <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>
 384 
 385   <span class="i">$This</span><span class="i">-&gt;_SetOrAddValuesOrValueIDs</span><span class="s">(</span><span class="q">&quot;SetValues&quot;</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 386 
 387   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 388 <span class="s">}</span>
 389 
 390 <span class="c"># Set value IDs of a fingerprint vector using a vector, reference to an array or an array...</span>
 391 <span class="c">#</span>
<a name="SetValueIDs-"></a> 392 <span class="k">sub </span><span class="m">SetValueIDs</span> <span class="s">{</span>
 393   <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>
 394 
 395   <span class="i">$This</span><span class="i">-&gt;_SetOrAddValuesOrValueIDs</span><span class="s">(</span><span class="q">&quot;SetValueIDs&quot;</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 396 
 397   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 398 <span class="s">}</span>
 399 
 400 <span class="c"># Add values to a fingerprint vector using a vector, reference to an array or an array...</span>
 401 <span class="c">#</span>
<a name="AddValues-"></a> 402 <span class="k">sub </span><span class="m">AddValues</span> <span class="s">{</span>
 403   <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>
 404 
 405   <span class="i">$This</span><span class="i">-&gt;_SetOrAddValuesOrValueIDs</span><span class="s">(</span><span class="q">&quot;AddValues&quot;</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 406 
 407   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 408 <span class="s">}</span>
 409 
 410 <span class="c"># Add value IDs to a fingerprint vector using a vector, reference to an array or an array...</span>
 411 <span class="c">#</span>
<a name="AddValueIDs-"></a> 412 <span class="k">sub </span><span class="m">AddValueIDs</span> <span class="s">{</span>
 413   <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>
 414 
 415   <span class="i">$This</span><span class="i">-&gt;_SetOrAddValuesOrValueIDs</span><span class="s">(</span><span class="q">&quot;AddValueIDs&quot;</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 416 
 417   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 418 <span class="s">}</span>
 419 
 420 <span class="c"># Set or add values or value IDs using:</span>
 421 <span class="c">#</span>
 422 <span class="c">#    o List of values or ValueIDs</span>
 423 <span class="c">#    o Reference to an list of values or ValuesIDs</span>
 424 <span class="c">#    o A vector containing values or ValueIDs</span>
 425 <span class="c">#</span>
<a name="_SetOrAddValuesOrValueIDs-"></a> 426 <span class="k">sub </span><span class="m">_SetOrAddValuesOrValueIDs</span> <span class="s">{</span>
 427   <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">@Values</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 428 
 429   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Values</span><span class="s">)</span> <span class="s">{</span>
 430     <span class="k">return</span><span class="sc">;</span>
 431   <span class="s">}</span>
 432 
 433   <span class="c"># Collect specified values or valueIDs...</span>
 434   <span class="k">my</span><span class="s">(</span><span class="i">$FirstValue</span><span class="cm">,</span> <span class="i">$TypeOfFirstValue</span><span class="cm">,</span> <span class="i">$ValuesRef</span><span class="s">)</span><span class="sc">;</span>
 435 
 436   <span class="i">$FirstValue</span> = <span class="i">$Values</span>[<span class="n">0</span>]<span class="sc">;</span>
 437   <span class="i">$TypeOfFirstValue</span> = <span class="k">ref</span> <span class="i">$FirstValue</span><span class="sc">;</span>
 438   <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>
 439     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt; _SetOrAddValuesOrValueIDs: Trying to add values to vector object with a reference to unsupported value format...&quot;</span><span class="sc">;</span>
 440   <span class="s">}</span>
 441 
 442   <span class="k">if</span> <span class="s">(</span><span class="i">Vector::IsVector</span><span class="s">(</span><span class="i">$FirstValue</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 443     <span class="c"># It&#39;s a vector...</span>
 444     <span class="i">$ValuesRef</span> = <span class="i">$FirstValue</span><span class="i">-&gt;GetValues</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 445   <span class="s">}</span>
 446   <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>
 447     <span class="c"># It&#39;s an array refernce...</span>
 448     <span class="i">$ValuesRef</span> = <span class="i">$FirstValue</span><span class="sc">;</span>
 449   <span class="s">}</span>
 450   <span class="k">else</span> <span class="s">{</span>
 451     <span class="c"># It&#39;s a list of values...</span>
 452     <span class="i">$ValuesRef</span> = \<span class="i">@Values</span><span class="sc">;</span>
 453   <span class="s">}</span>
 454 
 455   <span class="c"># Set or add values or value IDs...</span>
 456   <span class="j">MODE:</span> <span class="s">{</span>
 457     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^SetValues$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</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">Values</span>}}<span class="cm">,</span> <span class="i">@</span>{<span class="i">$ValuesRef</span>}<span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
 458     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^SetValueIDs$/i</span><span class="s">)</span> <span class="s">{</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</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">ValueIDs</span>}}<span class="cm">,</span> <span class="i">@</span>{<span class="i">$ValuesRef</span>}<span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
 459     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AddValues$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="cm">,</span> <span class="i">@</span>{<span class="i">$ValuesRef</span>}<span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
 460     <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AddValueIDs$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}}<span class="cm">,</span> <span class="i">@</span>{<span class="i">$ValuesRef</span>}<span class="sc">;</span> <span class="k">last</span> <span class="j">MODE</span><span class="sc">;</span> <span class="s">}</span>
 461     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt; _SetOrAddValuesOrValueIDs: Unknown mode $Mode...&quot;</span><span class="sc">;</span>
 462   <span class="s">}</span>
 463   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 464 <span class="s">}</span>
 465 
 466 <span class="c"># Set a specific value in fingerprint vector with indicies starting from 0..</span>
 467 <span class="c">#</span>
<a name="SetValue-"></a> 468 <span class="k">sub </span><span class="m">SetValue</span> <span class="s">{</span>
 469   <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="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$SkipCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 470 
 471   <span class="c"># Just set it...</span>
 472   <span class="k">if</span> <span class="s">(</span><span class="i">$SkipCheck</span><span class="s">)</span> <span class="s">{</span>
 473     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_SetValue</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 474   <span class="s">}</span>
 475 
 476   <span class="c"># Check and set...</span>
 477   <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>
 478     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetValue: Index value must be a positive number...&quot;</span><span class="sc">;</span>
 479   <span class="s">}</span>
 480   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> &gt;= <span class="i">$This</span><span class="i">-&gt;GetNumOfValues</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 481     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetValue: Index vaue must be less than number of values...&quot;</span><span class="sc">;</span>
 482   <span class="s">}</span>
 483 
 484   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_SetValue</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 485 <span class="s">}</span>
 486 
 487 <span class="c"># Set a fingerprint vector value...</span>
 488 <span class="c">#</span>
<a name="_SetValue-"></a> 489 <span class="k">sub </span><span class="m">_SetValue</span> <span class="s">{</span>
 490   <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="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 491 
 492   <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="i">$Value</span><span class="sc">;</span>
 493 
 494   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 495 <span class="s">}</span>
 496 
 497 <span class="c"># Get a specific value from fingerprint vector with indicies starting from 0...</span>
 498 <span class="c">#</span>
<a name="GetValue-"></a> 499 <span class="k">sub </span><span class="m">GetValue</span> <span class="s">{</span>
 500   <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>
 501 
 502   <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>
 503     <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>
 504   <span class="s">}</span>
 505   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> &gt;= <span class="i">$This</span><span class="i">-&gt;GetNumOfValues</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 506     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetValue: Index value must be less than number of values...&quot;</span><span class="sc">;</span>
 507   <span class="s">}</span>
 508   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetValue</span><span class="s">(</span><span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 509 <span class="s">}</span>
 510 
 511 <span class="c"># Get a fingerprint vector value...</span>
<a name="_GetValue-"></a> 512 <span class="k">sub </span><span class="m">_GetValue</span> <span class="s">{</span>
 513   <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>
 514 
 515   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 516 <span class="s">}</span>
 517 
 518 <span class="c"># Return vector values as an array or reference to an array...</span>
 519 <span class="c">#</span>
<a name="GetValues-"></a> 520 <span class="k">sub </span><span class="m">GetValues</span> <span class="s">{</span>
 521   <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>
 522 
 523   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}} <span class="co">:</span> \<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
 524 <span class="s">}</span>
 525 
 526 <span class="c"># Set a specific value ID in fingerprint vector with indicies starting from 0..</span>
 527 <span class="c">#</span>
<a name="SetValueID-"></a> 528 <span class="k">sub </span><span class="m">SetValueID</span> <span class="s">{</span>
 529   <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="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$SkipCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 530 
 531   <span class="c"># Just set it...</span>
 532   <span class="k">if</span> <span class="s">(</span><span class="i">$SkipCheck</span><span class="s">)</span> <span class="s">{</span>
 533     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_SetValueID</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 534   <span class="s">}</span>
 535 
 536   <span class="c"># Check and set...</span>
 537   <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>
 538     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetValueID: Index value must be a positive number...&quot;</span><span class="sc">;</span>
 539   <span class="s">}</span>
 540   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> &gt;= <span class="i">$This</span><span class="i">-&gt;GetNumOfValueIDs</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 541     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetValueID: Index vaue must be less than number of value IDs...&quot;</span><span class="sc">;</span>
 542   <span class="s">}</span>
 543 
 544   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_SetValueID</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 545 <span class="s">}</span>
 546 
 547 <span class="c"># Set a fingerprint vector value ID...</span>
 548 <span class="c">#</span>
<a name="_SetValueID-"></a> 549 <span class="k">sub </span><span class="m">_SetValueID</span> <span class="s">{</span>
 550   <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="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 551 
 552   <span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}[<span class="i">$Index</span>] = <span class="i">$Value</span><span class="sc">;</span>
 553 
 554   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 555 <span class="s">}</span>
 556 
 557 <span class="c"># Get a specific value ID from fingerprint vector with indicies starting from 0...</span>
 558 <span class="c">#</span>
<a name="GetValueID-"></a> 559 <span class="k">sub </span><span class="m">GetValueID</span> <span class="s">{</span>
 560   <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>
 561 
 562   <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>
 563     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetValueID: Index value must be a positive number...&quot;</span><span class="sc">;</span>
 564   <span class="s">}</span>
 565   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> &gt;= <span class="i">$This</span><span class="i">-&gt;GetNumOfValueIDs</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 566     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetValueID: Index value must be less than number of value IDs...&quot;</span><span class="sc">;</span>
 567   <span class="s">}</span>
 568   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetValueID</span><span class="s">(</span><span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 569 <span class="s">}</span>
 570 
 571 <span class="c"># Get a fingerprint vector value ID...</span>
 572 <span class="c">#</span>
<a name="_GetValueID-"></a> 573 <span class="k">sub </span><span class="m">_GetValueID</span> <span class="s">{</span>
 574   <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>
 575 
 576   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 577 <span class="s">}</span>
 578 
 579 <span class="c"># Return vector value IDs as an array or reference to an array...</span>
 580 <span class="c">#</span>
<a name="GetValueIDs-"></a> 581 <span class="k">sub </span><span class="m">GetValueIDs</span> <span class="s">{</span>
 582   <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>
 583 
 584   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}} <span class="co">:</span> \<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}}<span class="sc">;</span>
 585 <span class="s">}</span>
 586 
 587 <span class="c"># Get fingerprints vector string containing values and/or IDs string in a specifed format...</span>
 588 <span class="c">#</span>
<a name="GetFingerprintsVectorString-"></a> 589 <span class="k">sub </span><span class="m">GetFingerprintsVectorString</span> <span class="s">{</span>
 590   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Format</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 591 
 592   <span class="j">FORMAT :</span> <span class="s">{</span>
 593     <span class="k">if</span> <span class="s">(</span><span class="i">$Format</span> =~ <span class="q">/^(IDsAndValuesString|IDsAndValues)$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetIDsAndValuesString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">FORMAT</span><span class="sc">;</span> <span class="s">}</span>
 594     <span class="k">if</span> <span class="s">(</span><span class="i">$Format</span> =~ <span class="q">/^(IDsAndValuesPairsString|IDsAndValuesPairs)$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetIDsAndValuesPairsString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">FORMAT</span><span class="sc">;</span> <span class="s">}</span>
 595     <span class="k">if</span> <span class="s">(</span><span class="i">$Format</span> =~ <span class="q">/^(ValuesAndIDsString|ValuesAndIDs)$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetValuesAndIDsString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">FORMAT</span><span class="sc">;</span> <span class="s">}</span>
 596     <span class="k">if</span> <span class="s">(</span><span class="i">$Format</span> =~ <span class="q">/^(ValuesAndIDsPairsString|ValuesAndIDsPairs)$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetValuesAndIDsPairsString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">FORMAT</span><span class="sc">;</span><span class="s">}</span>
 597     <span class="k">if</span> <span class="s">(</span><span class="i">$Format</span> =~ <span class="q">/^(ValueIDsString|ValueIDs)$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetValueIDsString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">FORMAT</span><span class="sc">;</span> <span class="s">}</span>
 598     <span class="k">if</span> <span class="s">(</span><span class="i">$Format</span> =~ <span class="q">/^(ValuesString|Values)$/i</span><span class="s">)</span> <span class="s">{</span> <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetValuesString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="k">last</span> <span class="j">FORMAT</span><span class="sc">;</span> <span class="s">}</span>
 599     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetFingerprintsVectorString: Specified vector string format, $Format, is not supported. Value values: IDsAndValuesString, IDsAndValues, IDsAndValuesPairsString, IDsAndValuesPairs, ValuesAndIDsString, ValuesAndIDs, ValuesAndIDsPairsString, ValuesAndIDsPairs, ValueIDsString, ValueIDs, ValuesString, Values...&quot;</span><span class="sc">;</span>
 600   <span class="s">}</span>
 601   <span class="k">return</span> <span class="q">&#39;&#39;</span><span class="sc">;</span>
 602 <span class="s">}</span>
 603 <span class="c"># Get vector value IDs and values string as space delimited ASCII string separated</span>
 604 <span class="c"># by semicolon...</span>
 605 <span class="c">#</span>
<a name="GetIDsAndValuesString-"></a> 606 <span class="k">sub </span><span class="m">GetIDsAndValuesString</span> <span class="s">{</span>
 607   <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>
 608 
 609   <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}} &amp;&amp; <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="s">)</span> <span class="s">{</span>
 610     <span class="c"># Both IDs and values are available...</span>
 611     <span class="k">return</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">ValueIDs</span>}}<span class="s">)</span> . <span class="q">&quot;;&quot;</span> . <span class="k">join</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="s">)</span><span class="sc">;</span>
 612   <span class="s">}</span>
 613   <span class="k">elsif</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="s">)</span> <span class="s">{</span>
 614     <span class="c"># Only values are available...</span>
 615     <span class="k">return</span> <span class="q">&quot;None;&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">Values</span>}}<span class="s">)</span><span class="sc">;</span>
 616   <span class="s">}</span>
 617   <span class="k">else</span> <span class="s">{</span>
 618     <span class="c"># Values are not available...</span>
 619     <span class="k">return</span> <span class="q">&quot;None;None&quot;</span><span class="sc">;</span>
 620   <span class="s">}</span>
 621 <span class="s">}</span>
 622 
 623 <span class="c"># Get vector value IDs and value pairs string as space delimited ASCII string...</span>
 624 <span class="c">#</span>
<a name="GetIDsAndValuesPairsString-"></a> 625 <span class="k">sub </span><span class="m">GetIDsAndValuesPairsString</span> <span class="s">{</span>
 626   <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>
 627   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$ValueIDsPresent</span><span class="cm">,</span> <span class="i">@IDsAndValuesPairs</span><span class="s">)</span><span class="sc">;</span>
 628 
 629   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="s">)</span> <span class="s">{</span>
 630     <span class="c"># Values are unavailable...</span>
 631     <span class="k">return</span> <span class="q">&quot;None None&quot;</span><span class="sc">;</span>
 632   <span class="s">}</span>
 633 
 634   <span class="i">$ValueIDsPresent</span> = <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}} ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 635 
 636   <span class="i">@IDsAndValuesPairs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 637   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="s">)</span> <span class="s">{</span>
 638     <span class="k">if</span> <span class="s">(</span><span class="i">$ValueIDsPresent</span><span class="s">)</span> <span class="s">{</span>
 639       <span class="k">push</span> <span class="i">@IDsAndValuesPairs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}-&gt;[<span class="i">$Index</span>]<span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}-&gt;[<span class="i">$Index</span>]<span class="s">)</span><span class="sc">;</span>
 640     <span class="s">}</span>
 641     <span class="k">else</span> <span class="s">{</span>
 642       <span class="k">push</span> <span class="i">@IDsAndValuesPairs</span><span class="cm">,</span> <span class="s">(</span><span class="q">&#39;None&#39;</span><span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}-&gt;[<span class="i">$Index</span>]<span class="s">)</span><span class="sc">;</span>
 643     <span class="s">}</span>
 644   <span class="s">}</span>
 645   <span class="k">return</span> <span class="k">join</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@IDsAndValuesPairs</span><span class="s">)</span><span class="sc">;</span>
 646 <span class="s">}</span>
 647 
 648 <span class="c"># Get vector value and value IDs string as space delimited ASCII string separated</span>
 649 <span class="c"># by semicolon...</span>
 650 <span class="c">#</span>
<a name="GetValuesAndIDsString-"></a> 651 <span class="k">sub </span><span class="m">GetValuesAndIDsString</span> <span class="s">{</span>
 652   <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>
 653 
 654   <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}} &amp;&amp; <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="s">)</span> <span class="s">{</span>
 655     <span class="c"># Both IDs and values are available...</span>
 656     <span class="k">return</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">Values</span>}}<span class="s">)</span> . <span class="q">&quot;;&quot;</span> . <span class="k">join</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}}<span class="s">)</span><span class="sc">;</span>
 657   <span class="s">}</span>
 658   <span class="k">elsif</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="s">)</span> <span class="s">{</span>
 659     <span class="c"># Only values are available...</span>
 660     <span class="k">return</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">Values</span>}}<span class="s">)</span> . <span class="q">&quot;;None&quot;</span><span class="sc">;</span>
 661   <span class="s">}</span>
 662   <span class="k">else</span> <span class="s">{</span>
 663     <span class="c"># Values are not available...</span>
 664     <span class="k">return</span> <span class="q">&quot;None;None&quot;</span><span class="sc">;</span>
 665   <span class="s">}</span>
 666 <span class="s">}</span>
 667 
 668 <span class="c"># Get vector value and value ID pairs string as space delimited ASCII string...</span>
 669 <span class="c">#</span>
<a name="GetValuesAndIDsPairsString-"></a> 670 <span class="k">sub </span><span class="m">GetValuesAndIDsPairsString</span> <span class="s">{</span>
 671   <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>
 672   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$ValueIDsPresent</span><span class="cm">,</span> <span class="i">@ValuesAndIDsPairs</span><span class="s">)</span><span class="sc">;</span>
 673 
 674   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="s">)</span> <span class="s">{</span>
 675     <span class="c"># Values are unavailable...</span>
 676     <span class="k">return</span> <span class="q">&quot;None None&quot;</span><span class="sc">;</span>
 677   <span class="s">}</span>
 678 
 679   <span class="i">$ValueIDsPresent</span> = <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}} ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 680 
 681   <span class="i">@ValuesAndIDsPairs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 682   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="s">)</span> <span class="s">{</span>
 683     <span class="k">if</span> <span class="s">(</span><span class="i">$ValueIDsPresent</span><span class="s">)</span> <span class="s">{</span>
 684       <span class="k">push</span> <span class="i">@ValuesAndIDsPairs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}-&gt;[<span class="i">$Index</span>]<span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}-&gt;[<span class="i">$Index</span>]<span class="s">)</span><span class="sc">;</span>
 685     <span class="s">}</span>
 686     <span class="k">else</span> <span class="s">{</span>
 687       <span class="k">push</span> <span class="i">@ValuesAndIDsPairs</span><span class="cm">,</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}-&gt;[<span class="i">$Index</span>]<span class="cm">,</span> <span class="q">&#39;None&#39;</span><span class="s">)</span><span class="sc">;</span>
 688     <span class="s">}</span>
 689   <span class="s">}</span>
 690   <span class="k">return</span> <span class="k">join</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@ValuesAndIDsPairs</span><span class="s">)</span><span class="sc">;</span>
 691 <span class="s">}</span>
 692 
 693 <span class="c"># Get vector value IDs string as space delimited ASCII string...</span>
 694 <span class="c">#</span>
<a name="GetValueIDsString-"></a> 695 <span class="k">sub </span><span class="m">GetValueIDsString</span> <span class="s">{</span>
 696   <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>
 697 
 698   <span class="k">return</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</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">ValueIDs</span>}}<span class="s">)</span> <span class="co">:</span> <span class="q">&#39;None&#39;</span><span class="sc">;</span>
 699 <span class="s">}</span>
 700 
 701 <span class="c"># Get vector value string as space delimited ASCII string...</span>
 702 <span class="c">#</span>
<a name="GetValuesString-"></a> 703 <span class="k">sub </span><span class="m">GetValuesString</span> <span class="s">{</span>
 704   <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>
 705 
 706   <span class="k">return</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</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">Values</span>}}<span class="s">)</span> <span class="co">:</span> <span class="q">&#39;None&#39;</span><span class="sc">;</span>
 707 <span class="s">}</span>
 708 
 709 <span class="c"># Get number of values...</span>
<a name="GetNumOfValues-"></a> 710 <span class="k">sub </span><span class="m">GetNumOfValues</span> <span class="s">{</span>
 711   <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>
 712 
 713   <span class="k">return</span> <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
 714 <span class="s">}</span>
 715 
 716 <span class="c"># Get number of non-zero values...</span>
<a name="GetNumOfNonZeroValues-"></a> 717 <span class="k">sub </span><span class="m">GetNumOfNonZeroValues</span> <span class="s">{</span>
 718   <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>
 719   <span class="k">my</span><span class="s">(</span><span class="i">$Count</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span><span class="sc">;</span>
 720 
 721   <span class="i">$Count</span> = <span class="n">0</span><span class="sc">;</span>
 722   <span class="i">$Size</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfValues</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 723 
 724   <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">$Size</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 725     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] != <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
 726       <span class="i">$Count</span>++<span class="sc">;</span>
 727     <span class="s">}</span>
 728   <span class="s">}</span>
 729   <span class="k">return</span> <span class="i">$Count</span><span class="sc">;</span>
 730 <span class="s">}</span>
 731 
 732 <span class="c"># Get number of value IDs...</span>
<a name="GetNumOfValueIDs-"></a> 733 <span class="k">sub </span><span class="m">GetNumOfValueIDs</span> <span class="s">{</span>
 734   <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>
 735 
 736   <span class="k">return</span> <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}}<span class="sc">;</span>
 737 <span class="s">}</span>
 738 
 739 <span class="c"># FinegerprintsVectors class provides methods to calculate similarity between vectors</span>
 740 <span class="c"># containing three different types of values:</span>
 741 <span class="c">#</span>
 742 <span class="c"># Type I: OrderedNumericalValues</span>
 743 <span class="c">#</span>
 744 <span class="c">#   . Size of two vectors are same</span>
 745 <span class="c">#   . Vectors contain real values in a specific order. For example: MACCS keys count, Topological</span>
 746 <span class="c">#     pharnacophore atom pairs and so on.</span>
 747 <span class="c">#   . Option to calculate similarity value using continious values or binary values</span>
 748 <span class="c">#</span>
 749 <span class="c"># Type II: UnorderedNumericalValues</span>
 750 <span class="c">#</span>
 751 <span class="c">#   . Size of two vectors might not be same</span>
 752 <span class="c">#   . Vectors contain unordered real value identified by value IDs. For example: Toplogical atom pairs,</span>
 753 <span class="c">#     Topological atom torsions and so on</span>
 754 <span class="c">#   . Option to calculate similarity value using continous values or binary values</span>
 755 <span class="c">#</span>
 756 <span class="c"># Type III: AlphaNumericalValues</span>
 757 <span class="c">#</span>
 758 <span class="c">#   . Size of two vectors might not be same</span>
 759 <span class="c">#   . Vectors contain unordered alphanumerical values. For example: Extended connectivity fingerprints,</span>
 760 <span class="c">#     atom neighbothood fingerpritns.</span>
 761 <span class="c">#   . The vector values are treated as keys or bit indices and similarity value is calculated accordingly.</span>
 762 <span class="c">#</span>
 763 <span class="c"># Before performing similarity or distance calculations between vectors containing UnorderedNumericalValues</span>
 764 <span class="c"># or AlphaNumericalValues, the vectors are tranformed into vectors containing unique OrderedNumericalValues</span>
 765 <span class="c"># using value IDs for UnorderedNumericalValues and values itself for AlphaNumericalValues.</span>
 766 <span class="c">#</span>
 767 <span class="c"># Three forms similarity or distance calculation between two vectors: AlgebraicForm, BinaryForm or</span>
 768 <span class="c"># SetTheoreticForm.</span>
 769 <span class="c">#</span>
 770 <span class="c"># The value of an extra paramter, CalculationMode, passed to each similarity or distance function</span>
 771 <span class="c"># controls the calculation. Supported values for CalculationMode: AlgebraicForm, BinaryForm and</span>
 772 <span class="c"># SetTheoreticForm. Default: AlgebraicForm.</span>
 773 <span class="c">#</span>
 774 <span class="c"># For BinaryForm CalculationMode, the ordered list of processed final vector values containing the value or</span>
 775 <span class="c"># count of each unique value type is simply converted into a binary vector containing 1s and 0s</span>
 776 <span class="c"># corresponding to presence or absence of values before calculating similarity or distance between</span>
 777 <span class="c"># two vectors.</span>
 778 <span class="c">#</span>
 779 <span class="c"># For two fingerprint vectors A and B of same size containing OrderedNumericalValues, let:</span>
 780 <span class="c">#</span>
 781 <span class="c">#  N = Number values in A or B</span>
 782 <span class="c">#</span>
 783 <span class="c">#  Xa = Values of vector A</span>
 784 <span class="c">#  Xb = Values of vector B</span>
 785 <span class="c">#</span>
 786 <span class="c">#  Xai = Value of ith element in A</span>
 787 <span class="c">#  Xbi = Value of ith element in B</span>
 788 <span class="c">#</span>
 789 <span class="c">#  SUM = Sum of i over N values</span>
 790 <span class="c">#</span>
 791 <span class="c"># For SetTheoreticForm of calculation between two vectors, let:</span>
 792 <span class="c">#</span>
 793 <span class="c">#  SetIntersectionXaXb = SUM ( MIN ( Xai, Xbi ) )</span>
 794 <span class="c">#  SetDifferenceXaXb = SUM ( Xai ) + SUM ( Xbi ) - SUM ( MIN ( Xai, Xbi ) )</span>
 795 <span class="c">#</span>
 796 <span class="c"># For BinaryForm of calculation between two vectors, let:</span>
 797 <span class="c">#</span>
 798 <span class="c">#  Na = Number of bits set to &quot;1&quot; in A = SUM ( Xai )</span>
 799 <span class="c">#  Nb = Number of bits set to &quot;1&quot; in B = SUM ( Xbi )</span>
 800 <span class="c">#  Nc = Number of bits set to &quot;1&quot; in both A and B = SUM ( Xai * Xbi )</span>
 801 <span class="c">#  Nd = Number of bits set to &quot;0&quot; in both A and B = SUM ( 1 - Xai - Xbi + Xai * Xbi)</span>
 802 <span class="c">#</span>
 803 <span class="c">#  N = Number of bits set to &quot;1&quot; or &quot;0&quot; in A or B = Size of A or B = Na + Nb - Nc + Nd</span>
 804 <span class="c">#</span>
 805 <span class="c"># Additionally, for BinaryForm various values also correspond to:</span>
 806 <span class="c">#</span>
 807 <span class="c">#  Na = | Xa |</span>
 808 <span class="c">#  Nb = | Xb |</span>
 809 <span class="c">#  Nc = | SetIntersectionXaXb |</span>
 810 <span class="c">#  Nd = N - | SetDifferenceXaXb |</span>
 811 <span class="c">#</span>
 812 <span class="c">#  | SetDifferenceXaXb | = N - Nd = Na + Nb - Nc + Nd - Nd = Na + Nb - Nc</span>
 813 <span class="c">#                        =  | Xa | + | Xb | - | SetIntersectionXaXb |</span>
 814 <span class="c">#</span>
 815 <span class="c"># Various distance coefficients and similarity coefficients [ Ref 40, Ref 62, Ref 64 ] for a pair vectors A and B</span>
 816 <span class="c"># in AlgebraicForm and BinaryForm are defined as follows:</span>
 817 <span class="c">#</span>
 818 <span class="c"># . CityBlockDistanceCoefficient: ( same as HammingDistanceCoefficient and ManhattanDistanceCoefficient)</span>
 819 <span class="c">#</span>
 820 <span class="c">#     . AlgebraicForm: SUM ( ABS ( Xai - Xbi ) )</span>
 821 <span class="c">#</span>
 822 <span class="c">#     . BinaryForm: ( Na - Nc ) + ( Nb - Nc ) = Na + Nb - 2 * Nc</span>
 823 <span class="c">#</span>
 824 <span class="c">#     . SetTheoreticForm: | SetDifferenceXaXb | - | SetIntersectionXaXb |</span>
 825 <span class="c">#                        = SUM ( Xai ) + SUM ( Xbi ) - 2 * ( SUM ( MIN ( Xai, Xbi ) ) )</span>
 826 <span class="c">#</span>
 827 <span class="c"># . CosineSimilarityCoefficient:  ( same as OchiaiSimilarityCoefficient)</span>
 828 <span class="c">#</span>
 829 <span class="c">#     . AlgebraicForm: SUM ( Xai * Xbi ) / SQRT ( SUM ( Xai ** 2) * SUM ( Xbi ** 2) )</span>
 830 <span class="c">#</span>
 831 <span class="c">#     . BinaryForm: Nc / SQRT ( Na * Nb)</span>
 832 <span class="c">#</span>
 833 <span class="c">#     . SetTheoreticForm: | SetIntersectionXaXb | / SQRT ( |Xa| * |Xb| )</span>
 834 <span class="c">#                        = SUM ( MIN ( Xai, Xbi ) ) / SQRT ( SUM ( Xai ) * SUM ( Xbi ) )</span>
 835 <span class="c">#</span>
 836 <span class="c"># . CzekanowskiSimilarityCoefficient: ( same as DiceSimilarityCoefficient and SorensonSimilarityCoefficient)</span>
 837 <span class="c">#</span>
 838 <span class="c">#     . AlgebraicForm: ( 2 * ( SUM ( Xai * Xbi ) )  ) / ( SUM ( Xai ** 2) + SUM ( Xbi **2 ) )</span>
 839 <span class="c">#</span>
 840 <span class="c">#     . BinaryForm: 2 * Nc / ( Na + Nb )</span>
 841 <span class="c">#</span>
 842 <span class="c">#     . SetTheoreticForm: 2 * | SetIntersectionXaXb | / ( |Xa| + |Xb| )</span>
 843 <span class="c">#                        = 2 * ( SUM ( MIN ( Xai, Xbi ) ) ) / ( SUM ( Xai ) + SUM ( Xbi ) )</span>
 844 <span class="c">#</span>
 845 <span class="c"># . DiceSimilarityCoefficient: ( same as CzekanowskiSimilarityCoefficient and SorensonSimilarityCoefficient)</span>
 846 <span class="c">#</span>
 847 <span class="c">#     . AlgebraicForm: ( 2 * ( SUM ( Xai * Xbi ) )  ) / ( SUM ( Xai ** 2) + SUM ( Xbi **2 ) )</span>
 848 <span class="c">#</span>
 849 <span class="c">#     . BinaryForm: 2 * Nc / ( Na + Nb )</span>
 850 <span class="c">#</span>
 851 <span class="c">#     . SetTheoreticForm: 2 * | SetIntersectionXaXb | / ( |Xa| + |Xb| )</span>
 852 <span class="c">#                        = 2 * ( SUM ( MIN ( Xai, Xbi ) ) ) / ( SUM ( Xai ) + SUM ( Xbi ) )</span>
 853 <span class="c">#</span>
 854 <span class="c"># . EuclideanDistanceCoefficient:</span>
 855 <span class="c">#</span>
 856 <span class="c">#     . AlgebraicForm: SQRT ( SUM ( ( ( Xai - Xbi ) ** 2 ) ) )</span>
 857 <span class="c">#</span>
 858 <span class="c">#     . BinaryForm: SQRT ( ( Na - Nc ) + ( Nb - Nc ) ) = SQRT ( Na + Nb - 2 * Nc )</span>
 859 <span class="c">#</span>
 860 <span class="c">#     . SetTheoreticForm: SQRT ( | SetDifferenceXaXb | - | SetIntersectionXaXb | )</span>
 861 <span class="c">#                        = SQRT (  SUM ( Xai ) + SUM ( Xbi ) - 2 * ( SUM ( MIN ( Xai, Xbi ) ) ) )</span>
 862 <span class="c">#</span>
 863 <span class="c"># . HammingDistanceCoefficient:  ( same as CityBlockDistanceCoefficient and ManhattanDistanceCoefficient)</span>
 864 <span class="c">#</span>
 865 <span class="c">#     . AlgebraicForm: SUM ( ABS ( Xai - Xbi ) )</span>
 866 <span class="c">#</span>
 867 <span class="c">#     . BinaryForm: ( Na - Nc ) + ( Nb - Nc ) = Na + Nb - 2 * Nc</span>
 868 <span class="c">#</span>
 869 <span class="c">#     . SetTheoreticForm: | SetDifferenceXaXb | - | SetIntersectionXaXb |</span>
 870 <span class="c">#                        = SUM ( Xai ) + SUM ( Xbi ) - 2 * ( SUM ( MIN ( Xai, Xbi ) ) )</span>
 871 <span class="c">#</span>
 872 <span class="c"># . JaccardSimilarityCoefficient: ( same as TanimotoSimilarityCoefficient)</span>
 873 <span class="c">#</span>
 874 <span class="c">#     . AlgebraicForm:  SUM ( Xai * Xbi ) / ( SUM ( Xai ** 2 ) + SUM ( Xbi ** 2 ) - SUM ( Xai * Xbi ) )</span>
 875 <span class="c">#</span>
 876 <span class="c">#     . BinaryForm:  Nc / ( ( Na - Nc ) + ( Nb - Nc ) + Nc ) = Nc / ( Na + Nb - Nc )</span>
 877 <span class="c">#</span>
 878 <span class="c">#     . SetTheoreticForm: | SetIntersectionXaXb | / | SetDifferenceXaXb |</span>
 879 <span class="c">#                        = SUM ( MIN ( Xai, Xbi ) ) / (  SUM ( Xai ) + SUM ( Xbi ) - SUM ( MIN ( Xai, Xbi ) ) )</span>
 880 <span class="c">#</span>
 881 <span class="c"># . ManhattanDistanceCoefficient:  ( same as CityBlockDistanceCoefficient and HammingDistanceCoefficient)</span>
 882 <span class="c">#</span>
 883 <span class="c">#     . AlgebraicForm: SUM ( ABS ( Xai - Xbi ) )</span>
 884 <span class="c">#</span>
 885 <span class="c">#     . BinaryForm: ( Na - Nc ) + ( Nb - Nc ) = Na + Nb - 2 * Nc</span>
 886 <span class="c">#</span>
 887 <span class="c">#     . SetTheoreticForm: | SetDifferenceXaXb | - | SetIntersectionXaXb |</span>
 888 <span class="c">#                        = SUM ( Xai ) + SUM ( Xbi ) - 2 * ( SUM ( MIN ( Xai, Xbi ) ) )</span>
 889 <span class="c">#</span>
 890 <span class="c"># . OchiaiSimilarityCoefficient:  ( same as CosineSimilarityCoefficient)</span>
 891 <span class="c">#</span>
 892 <span class="c">#     . AlgebraicForm: SUM ( Xai * Xbi ) / SQRT ( SUM ( Xai ** 2) * SUM ( Xbi ** 2) )</span>
 893 <span class="c">#</span>
 894 <span class="c">#     . BinaryForm: Nc / SQRT ( Na * Nb)</span>
 895 <span class="c">#</span>
 896 <span class="c">#     . SetTheoreticForm: | SetIntersectionXaXb | / SQRT ( |Xa| * |Xb| )</span>
 897 <span class="c">#                        = SUM ( MIN ( Xai, Xbi ) ) / SQRT ( SUM ( Xai ) * SUM ( Xbi ) )</span>
 898 <span class="c">#</span>
 899 <span class="c"># . SorensonSimilarityCoefficient: ( same as CzekanowskiSimilarityCoefficient and DiceSimilarityCoefficient)</span>
 900 <span class="c">#</span>
 901 <span class="c">#     . AlgebraicForm: ( 2 * ( SUM ( Xai * Xbi ) )  ) / ( SUM ( Xai ** 2) + SUM ( Xbi **2 ) )</span>
 902 <span class="c">#</span>
 903 <span class="c">#     . BinaryForm: 2 * Nc / ( Na + Nb )</span>
 904 <span class="c">#</span>
 905 <span class="c">#     . SetTheoreticForm: 2 * | SetIntersectionXaXb | / ( |Xa| + |Xb| )</span>
 906 <span class="c">#                        = 2 * ( SUM ( MIN ( Xai, Xbi ) ) ) / ( SUM ( Xai ) + SUM ( Xbi ) )</span>
 907 <span class="c">#</span>
 908 <span class="c"># . SoergelDistanceCoefficient:</span>
 909 <span class="c">#</span>
 910 <span class="c">#     . AlgebraicForm:  SUM ( ABS ( Xai - Xbi ) ) / SUM ( MAX ( Xai, Xbi ) )</span>
 911 <span class="c">#</span>
 912 <span class="c">#     . BinaryForm: 1 - Nc / ( Na + Nb - Nc ) = ( Na + Nb - 2 * Nc ) / ( Na + Nb - Nc )</span>
 913 <span class="c">#</span>
 914 <span class="c">#     . SetTheoreticForm: ( | SetDifferenceXaXb | - | SetIntersectionXaXb | ) / | SetDifferenceXaXb |</span>
 915 <span class="c">#                        = ( SUM ( Xai ) + SUM ( Xbi ) - 2 * ( SUM ( MIN ( Xai, Xbi ) ) ) ) / ( SUM ( Xai ) + SUM ( Xbi ) - SUM ( MIN ( Xai, Xbi ) ) )</span>
 916 <span class="c">#</span>
 917 <span class="c"># . TanimotoSimilarityCoefficient:  ( same as JaccardSimilarityCoefficient)</span>
 918 <span class="c">#</span>
 919 <span class="c">#     . AlgebraicForm:  SUM ( Xai * Xbi ) / ( SUM ( Xai ** 2 ) + SUM ( Xbi ** 2 ) - SUM ( Xai * Xbi ) )</span>
 920 <span class="c">#</span>
 921 <span class="c">#     . BinaryForm:  Nc / ( ( Na - Nc ) + ( Nb - Nc ) + Nc ) = Nc / ( Na + Nb - Nc )</span>
 922 <span class="c">#</span>
 923 <span class="c">#     . SetTheoreticForm: | SetIntersectionXaXb | / | SetDifferenceXaXb |</span>
 924 <span class="c">#                        = SUM ( MIN ( Xai, Xbi ) ) / (  SUM ( Xai ) + SUM ( Xbi ) - SUM ( MIN ( Xai, Xbi ) ) )</span>
 925 <span class="c">#</span>
 926 <span class="c">#</span>
 927 
 928 <span class="c"># Calculate Hamming distance coefficient between two fingerprint vectors.</span>
 929 <span class="c">#</span>
 930 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
 931 <span class="c">#</span>
<a name="HammingDistanceCoefficient-"></a> 932 <span class="k">sub </span><span class="m">HammingDistanceCoefficient ($$;$$)</span> <span class="s">{</span>
 933   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 934 
 935   <span class="k">return</span> <span class="i">CityBlockDistanceCoefficient</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span><span class="sc">;</span>
 936 <span class="s">}</span>
 937 
 938 <span class="c"># Calculate Hamming distance coefficient between two fingerprint vectors.</span>
 939 <span class="c">#</span>
 940 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
 941 <span class="c">#</span>
<a name="ManhattanDistanceCoefficient-"></a> 942 <span class="k">sub </span><span class="m">ManhattanDistanceCoefficient ($$;$$)</span> <span class="s">{</span>
 943   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 944 
 945   <span class="k">return</span> <span class="i">CityBlockDistanceCoefficient</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span><span class="sc">;</span>
 946 <span class="s">}</span>
 947 
 948 <span class="c"># Calculate CityBlock distance coefficient between two fingerprint vectors.</span>
 949 <span class="c">#</span>
 950 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
 951 <span class="c">#</span>
<a name="CityBlockDistanceCoefficient-"></a> 952 <span class="k">sub </span><span class="m">CityBlockDistanceCoefficient ($$;$$)</span> <span class="s">{</span>
 953   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 954 
 955   <span class="i">$CalculationMode</span> = <span class="k">defined</span> <span class="i">$CalculationMode</span> ? <span class="i">$CalculationMode</span> <span class="co">:</span> <span class="q">&#39;AlgebraicForm&#39;</span><span class="sc">;</span>
 956   <span class="i">$SkipValuesCheck</span> = <span class="k">defined</span> <span class="i">$SkipValuesCheck</span> ? <span class="i">$SkipValuesCheck</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 957 
 958   <span class="c"># Validate and process fingerprints vectors for similarity calculations...</span>
 959   <span class="c">#</span>
 960   <span class="i">_ValidateAndProcessFingerprintsVectorsForSimilarityCalculation</span><span class="s">(</span><span class="q">&quot;CityBlockDistanceCoefficient: Calculation failed&quot;</span><span class="cm">,</span> <span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span><span class="sc">;</span>
 961 
 962   <span class="c"># Perform the calculation...</span>
 963   <span class="k">if</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^AlgebraicForm$/i</span><span class="s">)</span> <span class="s">{</span>
 964     <span class="k">return</span> <span class="i">_CityBlockDistanceCoefficientUsingAlgebraicForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
 965   <span class="s">}</span>
 966   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^BinaryForm$/i</span><span class="s">)</span> <span class="s">{</span>
 967     <span class="k">return</span> <span class="i">_CityBlockDistanceCoefficientUsingBinaryForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
 968   <span class="s">}</span>
 969   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^SetTheoreticForm$/i</span><span class="s">)</span> <span class="s">{</span>
 970     <span class="k">return</span> <span class="i">_CityBlockDistanceCoefficientUsingSetTheoreticForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
 971   <span class="s">}</span>
 972   <span class="k">else</span> <span class="s">{</span>
 973     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
 974   <span class="s">}</span>
 975 <span class="s">}</span>
 976 
 977 <span class="c"># Calculate CityBlock distance coefficient using algebraic form...</span>
 978 <span class="c">#</span>
<a name="_CityBlockDistanceCoefficientUsingAlgebraicForm-"></a> 979 <span class="k">sub </span><span class="m">_CityBlockDistanceCoefficientUsingAlgebraicForm</span> <span class="s">{</span>
 980   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 981   <span class="k">my</span><span class="s">(</span><span class="i">$SumAbsSubtractionXaiXbi</span><span class="s">)</span><span class="sc">;</span>
 982 
 983   <span class="i">$SumAbsSubtractionXaiXbi</span> = <span class="i">_GetSumOfAbsoluteValueOfSubtractionOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
 984 
 985   <span class="k">return</span> <span class="i">$SumAbsSubtractionXaiXbi</span><span class="sc">;</span>
 986 <span class="s">}</span>
 987 
 988 <span class="c"># Calculate CityBlock distance coefficient using binary form...</span>
 989 <span class="c">#</span>
<a name="_CityBlockDistanceCoefficientUsingBinaryForm-"></a> 990 <span class="k">sub </span><span class="m">_CityBlockDistanceCoefficientUsingBinaryForm</span> <span class="s">{</span>
 991   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 992   <span class="k">my</span><span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="s">)</span><span class="sc">;</span>
 993 
 994   <span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="s">)</span> = <span class="i">_GetNumOfIndividualAndCommonSetBits</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
 995 
 996   <span class="k">return</span>  <span class="s">(</span><span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="n">2</span> * <span class="i">$Nc</span><span class="s">)</span><span class="sc">;</span>
 997 <span class="s">}</span>
 998 
 999 <span class="c"># Calculate  CityBlock distance coefficient using set theoretic form...</span>
1000 <span class="c">#</span>
<a name="_CityBlockDistanceCoefficientUsingSetTheoreticForm-"></a>1001 <span class="k">sub </span><span class="m">_CityBlockDistanceCoefficientUsingSetTheoreticForm</span> <span class="s">{</span>
1002   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1003   <span class="k">my</span><span class="s">(</span><span class="i">$SumMinXaiXbi</span><span class="cm">,</span> <span class="i">$SumXai</span><span class="cm">,</span> <span class="i">$SumXbi</span><span class="s">)</span><span class="sc">;</span>
1004 
1005   <span class="i">$SumXai</span> = <span class="i">_GetSumOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="s">)</span><span class="sc">;</span>
1006   <span class="i">$SumXbi</span> = <span class="i">_GetSumOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1007   <span class="i">$SumMinXaiXbi</span> = <span class="i">_GetSumOfMinimumOfFingerprintsOrderdedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1008 
1009   <span class="k">return</span>  <span class="s">(</span><span class="i">$SumXai</span> + <span class="i">$SumXbi</span> - <span class="n">2</span> * <span class="i">$SumMinXaiXbi</span><span class="s">)</span><span class="sc">;</span>
1010 <span class="s">}</span>
1011 
1012 <span class="c"># Calculate Ochiai similarity cofficient between two fingerprint vectors.</span>
1013 <span class="c">#</span>
1014 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
1015 <span class="c">#</span>
<a name="OchiaiSimilarityCoefficient-"></a>1016 <span class="k">sub </span><span class="m">OchiaiSimilarityCoefficient ($$;$$)</span> <span class="s">{</span>
1017   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1018 
1019   <span class="k">return</span> <span class="i">CosineSimilarityCoefficient</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span><span class="sc">;</span>
1020 <span class="s">}</span>
1021 
1022 <span class="c"># Calculate Cosine similarity cofficient between two fingerprint vectors.</span>
1023 <span class="c">#</span>
1024 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
1025 <span class="c">#</span>
<a name="CosineSimilarityCoefficient-"></a>1026 <span class="k">sub </span><span class="m">CosineSimilarityCoefficient ($$;$$)</span> <span class="s">{</span>
1027   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1028 
1029   <span class="i">$CalculationMode</span> = <span class="k">defined</span> <span class="i">$CalculationMode</span> ? <span class="i">$CalculationMode</span> <span class="co">:</span> <span class="q">&#39;AlgebraicForm&#39;</span><span class="sc">;</span>
1030   <span class="i">$SkipValuesCheck</span> = <span class="k">defined</span> <span class="i">$SkipValuesCheck</span> ? <span class="i">$SkipValuesCheck</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1031 
1032   <span class="c"># Validate and process fingerprints vectors for similarity calculations...</span>
1033   <span class="c">#</span>
1034   <span class="i">_ValidateAndProcessFingerprintsVectorsForSimilarityCalculation</span><span class="s">(</span><span class="q">&quot;CosineSimilarityCoefficient: Calculation failed&quot;</span><span class="cm">,</span> <span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span><span class="sc">;</span>
1035 
1036   <span class="c"># Perform the calculation...</span>
1037   <span class="k">if</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^AlgebraicForm$/i</span><span class="s">)</span> <span class="s">{</span>
1038     <span class="k">return</span> <span class="i">_CosineSimilarityCoefficientUsingAlgebraicForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1039   <span class="s">}</span>
1040   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^BinaryForm$/i</span><span class="s">)</span> <span class="s">{</span>
1041     <span class="k">return</span> <span class="i">_CosineSimilarityCoefficientUsingBinaryForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1042   <span class="s">}</span>
1043   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^SetTheoreticForm$/i</span><span class="s">)</span> <span class="s">{</span>
1044     <span class="k">return</span> <span class="i">_CosineSimilarityCoefficientUsingSetTheoreticForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1045   <span class="s">}</span>
1046   <span class="k">else</span> <span class="s">{</span>
1047     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
1048   <span class="s">}</span>
1049 <span class="s">}</span>
1050 
1051 <span class="c"># Calculate Cosine similarity coefficient using algebraic form...</span>
1052 <span class="c">#</span>
<a name="_CosineSimilarityCoefficientUsingAlgebraicForm-"></a>1053 <span class="k">sub </span><span class="m">_CosineSimilarityCoefficientUsingAlgebraicForm</span> <span class="s">{</span>
1054   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1055   <span class="k">my</span><span class="s">(</span><span class="i">$SumProductXaiXbi</span><span class="cm">,</span> <span class="i">$SumXai2</span><span class="cm">,</span> <span class="i">$SumXbi2</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span><span class="sc">;</span>
1056 
1057   <span class="i">$SumXai2</span> = <span class="i">_GetSumOfSquaresOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="s">)</span><span class="sc">;</span>
1058   <span class="i">$SumXbi2</span> = <span class="i">_GetSumOfSquaresOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1059   <span class="i">$SumProductXaiXbi</span> = <span class="i">_GetSumOfProductOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1060 
1061   <span class="i">$Numerator</span> = <span class="i">$SumProductXaiXbi</span><span class="sc">;</span>
1062   <span class="i">$Denominator</span> = <span class="k">sqrt</span><span class="s">(</span><span class="i">$SumXai2</span> * <span class="i">$SumXbi2</span><span class="s">)</span><span class="sc">;</span>
1063 
1064   <span class="k">return</span>  <span class="i">$Denominator</span> ? <span class="s">(</span><span class="i">$Numerator</span>/<span class="i">$Denominator</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1065 <span class="s">}</span>
1066 
1067 <span class="c"># CalculateCosine similarity coefficient using binary form...</span>
1068 <span class="c">#</span>
<a name="_CosineSimilarityCoefficientUsingBinaryForm-"></a>1069 <span class="k">sub </span><span class="m">_CosineSimilarityCoefficientUsingBinaryForm</span> <span class="s">{</span>
1070   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1071   <span class="k">my</span><span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span><span class="sc">;</span>
1072 
1073   <span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="s">)</span> = <span class="i">_GetNumOfIndividualAndCommonSetBits</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1074 
1075   <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span>
1076   <span class="i">$Denominator</span> = <span class="k">sqrt</span><span class="s">(</span><span class="i">$Na</span> * <span class="i">$Nb</span><span class="s">)</span><span class="sc">;</span>
1077 
1078   <span class="k">return</span>  <span class="i">$Denominator</span> ? <span class="s">(</span><span class="i">$Numerator</span>/<span class="i">$Denominator</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1079 <span class="s">}</span>
1080 
1081 <span class="c"># Calculate Cosine similarity coefficient using set theoretic form...</span>
1082 <span class="c">#</span>
<a name="_CosineSimilarityCoefficientUsingSetTheoreticForm-"></a>1083 <span class="k">sub </span><span class="m">_CosineSimilarityCoefficientUsingSetTheoreticForm</span> <span class="s">{</span>
1084   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1085   <span class="k">my</span><span class="s">(</span><span class="i">$SumMinXaiXbi</span><span class="cm">,</span> <span class="i">$SumXai</span><span class="cm">,</span> <span class="i">$SumXbi</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span><span class="sc">;</span>
1086 
1087   <span class="i">$SumXai</span> = <span class="i">_GetSumOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="s">)</span><span class="sc">;</span>
1088   <span class="i">$SumXbi</span> = <span class="i">_GetSumOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1089   <span class="i">$SumMinXaiXbi</span> = <span class="i">_GetSumOfMinimumOfFingerprintsOrderdedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1090 
1091   <span class="i">$Numerator</span> = <span class="i">$SumMinXaiXbi</span><span class="sc">;</span>
1092   <span class="i">$Denominator</span> = <span class="k">sqrt</span><span class="s">(</span><span class="i">$SumXai</span> * <span class="i">$SumXbi</span><span class="s">)</span><span class="sc">;</span>
1093 
1094   <span class="k">return</span>  <span class="i">$Denominator</span> ? <span class="s">(</span><span class="i">$Numerator</span>/<span class="i">$Denominator</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1095 <span class="s">}</span>
1096 
1097 <span class="c"># Calculate Czekanowski similarity cofficient between two fingerprint vectors.</span>
1098 <span class="c">#</span>
1099 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
1100 <span class="c">#</span>
<a name="CzekanowskiSimilarityCoefficient-"></a>1101 <span class="k">sub </span><span class="m">CzekanowskiSimilarityCoefficient ($$;$$)</span> <span class="s">{</span>
1102   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1103 
1104   <span class="k">return</span> <span class="i">DiceSimilarityCoefficient</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span><span class="sc">;</span>
1105 <span class="s">}</span>
1106 
1107 <span class="c"># Calculate Sorenson similarity cofficient between two fingerprint vectors.</span>
1108 <span class="c">#</span>
1109 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
1110 <span class="c">#</span>
<a name="SorensonSimilarityCoefficient-"></a>1111 <span class="k">sub </span><span class="m">SorensonSimilarityCoefficient ($$;$$)</span> <span class="s">{</span>
1112   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1113 
1114   <span class="k">return</span> <span class="i">DiceSimilarityCoefficient</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span><span class="sc">;</span>
1115 <span class="s">}</span>
1116 
1117 <span class="c"># Calculate Dice similarity cofficient between two fingerprint vectors.</span>
1118 <span class="c">#</span>
1119 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
1120 <span class="c">#</span>
<a name="DiceSimilarityCoefficient-"></a>1121 <span class="k">sub </span><span class="m">DiceSimilarityCoefficient ($$;$$)</span> <span class="s">{</span>
1122   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1123 
1124   <span class="i">$CalculationMode</span> = <span class="k">defined</span> <span class="i">$CalculationMode</span> ? <span class="i">$CalculationMode</span> <span class="co">:</span> <span class="q">&#39;AlgebraicForm&#39;</span><span class="sc">;</span>
1125   <span class="i">$SkipValuesCheck</span> = <span class="k">defined</span> <span class="i">$SkipValuesCheck</span> ? <span class="i">$SkipValuesCheck</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1126 
1127   <span class="c"># Validate and process fingerprints vectors for similarity calculations...</span>
1128   <span class="c">#</span>
1129   <span class="i">_ValidateAndProcessFingerprintsVectorsForSimilarityCalculation</span><span class="s">(</span><span class="q">&quot;DiceSimilarityCoefficient: Calculation failed&quot;</span><span class="cm">,</span> <span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span><span class="sc">;</span>
1130 
1131   <span class="c"># Perform the calculation...</span>
1132   <span class="k">if</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^AlgebraicForm$/i</span><span class="s">)</span> <span class="s">{</span>
1133     <span class="k">return</span> <span class="i">_DiceSimilarityCoefficientUsingAlgebraicForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1134   <span class="s">}</span>
1135   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^BinaryForm$/i</span><span class="s">)</span> <span class="s">{</span>
1136     <span class="k">return</span> <span class="i">_DiceSimilarityCoefficientUsingBinaryForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1137   <span class="s">}</span>
1138   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^SetTheoreticForm$/i</span><span class="s">)</span> <span class="s">{</span>
1139     <span class="k">return</span> <span class="i">_DiceSimilarityCoefficientUsingSetTheoreticForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1140   <span class="s">}</span>
1141   <span class="k">else</span> <span class="s">{</span>
1142     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
1143   <span class="s">}</span>
1144 <span class="s">}</span>
1145 
1146 <span class="c"># Calculate Dice similarity coefficient using algebraic form...</span>
1147 <span class="c">#</span>
<a name="_DiceSimilarityCoefficientUsingAlgebraicForm-"></a>1148 <span class="k">sub </span><span class="m">_DiceSimilarityCoefficientUsingAlgebraicForm</span> <span class="s">{</span>
1149   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1150   <span class="k">my</span><span class="s">(</span><span class="i">$SumProductXaiXbi</span><span class="cm">,</span> <span class="i">$SumXai2</span><span class="cm">,</span> <span class="i">$SumXbi2</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span><span class="sc">;</span>
1151 
1152   <span class="i">$SumXai2</span> = <span class="i">_GetSumOfSquaresOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="s">)</span><span class="sc">;</span>
1153   <span class="i">$SumXbi2</span> = <span class="i">_GetSumOfSquaresOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1154   <span class="i">$SumProductXaiXbi</span> = <span class="i">_GetSumOfProductOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1155 
1156   <span class="i">$Numerator</span> = <span class="n">2</span> * <span class="i">$SumProductXaiXbi</span><span class="sc">;</span>
1157   <span class="i">$Denominator</span> = <span class="i">$SumXai2</span> + <span class="i">$SumXbi2</span><span class="sc">;</span>
1158 
1159   <span class="k">return</span>  <span class="i">$Denominator</span> ? <span class="s">(</span><span class="i">$Numerator</span>/<span class="i">$Denominator</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1160 <span class="s">}</span>
1161 
1162 <span class="c"># Calculate Dice similarity coefficient using binary form...</span>
1163 <span class="c">#</span>
<a name="_DiceSimilarityCoefficientUsingBinaryForm-"></a>1164 <span class="k">sub </span><span class="m">_DiceSimilarityCoefficientUsingBinaryForm</span> <span class="s">{</span>
1165   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1166   <span class="k">my</span><span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span><span class="sc">;</span>
1167 
1168   <span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="s">)</span> = <span class="i">_GetNumOfIndividualAndCommonSetBits</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1169 
1170   <span class="i">$Numerator</span> = <span class="n">2</span> * <span class="i">$Nc</span><span class="sc">;</span>
1171   <span class="i">$Denominator</span> = <span class="i">$Na</span> + <span class="i">$Nb</span><span class="sc">;</span>
1172 
1173   <span class="k">return</span>  <span class="i">$Denominator</span> ? <span class="s">(</span><span class="i">$Numerator</span>/<span class="i">$Denominator</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1174 <span class="s">}</span>
1175 
1176 <span class="c"># Calculate Dice similarity coefficient using set theoretic form...</span>
1177 <span class="c">#</span>
<a name="_DiceSimilarityCoefficientUsingSetTheoreticForm-"></a>1178 <span class="k">sub </span><span class="m">_DiceSimilarityCoefficientUsingSetTheoreticForm</span> <span class="s">{</span>
1179   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1180   <span class="k">my</span><span class="s">(</span><span class="i">$SumMinXaiXbi</span><span class="cm">,</span> <span class="i">$SumXai</span><span class="cm">,</span> <span class="i">$SumXbi</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span><span class="sc">;</span>
1181 
1182   <span class="i">$SumXai</span> = <span class="i">_GetSumOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="s">)</span><span class="sc">;</span>
1183   <span class="i">$SumXbi</span> = <span class="i">_GetSumOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1184   <span class="i">$SumMinXaiXbi</span> = <span class="i">_GetSumOfMinimumOfFingerprintsOrderdedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1185 
1186   <span class="i">$Numerator</span> = <span class="n">2</span> * <span class="i">$SumMinXaiXbi</span><span class="sc">;</span>
1187   <span class="i">$Denominator</span> = <span class="i">$SumXai</span> + <span class="i">$SumXbi</span><span class="sc">;</span>
1188 
1189   <span class="k">return</span>  <span class="i">$Denominator</span> ? <span class="s">(</span><span class="i">$Numerator</span>/<span class="i">$Denominator</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1190 <span class="s">}</span>
1191 
1192 
1193 <span class="c"># Calculate Euclidean distance coefficient between two fingerprint vectors.</span>
1194 <span class="c">#</span>
1195 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
1196 <span class="c">#</span>
<a name="EuclideanDistanceCoefficient-"></a>1197 <span class="k">sub </span><span class="m">EuclideanDistanceCoefficient ($$;$$)</span> <span class="s">{</span>
1198   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1199 
1200   <span class="i">$CalculationMode</span> = <span class="k">defined</span> <span class="i">$CalculationMode</span> ? <span class="i">$CalculationMode</span> <span class="co">:</span> <span class="q">&#39;AlgebraicForm&#39;</span><span class="sc">;</span>
1201   <span class="i">$SkipValuesCheck</span> = <span class="k">defined</span> <span class="i">$SkipValuesCheck</span> ? <span class="i">$SkipValuesCheck</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1202 
1203   <span class="c"># Validate and process fingerprints vectors for similarity calculations...</span>
1204   <span class="c">#</span>
1205   <span class="i">_ValidateAndProcessFingerprintsVectorsForSimilarityCalculation</span><span class="s">(</span><span class="q">&quot;EuclideanDistanceCoefficient: Calculation failed&quot;</span><span class="cm">,</span> <span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span><span class="sc">;</span>
1206 
1207   <span class="c"># Perform the calculation...</span>
1208   <span class="k">if</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^AlgebraicForm$/i</span><span class="s">)</span> <span class="s">{</span>
1209     <span class="k">return</span> <span class="i">_EuclideanDistanceCoefficientUsingAlgebraicForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1210   <span class="s">}</span>
1211   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^BinaryForm$/i</span><span class="s">)</span> <span class="s">{</span>
1212     <span class="k">return</span> <span class="i">_EuclideanDistanceCoefficientUsingBinaryForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1213   <span class="s">}</span>
1214   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^SetTheoreticForm$/i</span><span class="s">)</span> <span class="s">{</span>
1215     <span class="k">return</span> <span class="i">_EuclideanDistanceCoefficientUsingSetTheoreticForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1216   <span class="s">}</span>
1217   <span class="k">else</span> <span class="s">{</span>
1218     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
1219   <span class="s">}</span>
1220 <span class="s">}</span>
1221 
1222 <span class="c"># Calculate Euclidean distance coefficient using algebraic form...</span>
1223 <span class="c">#</span>
<a name="_EuclideanDistanceCoefficientUsingAlgebraicForm-"></a>1224 <span class="k">sub </span><span class="m">_EuclideanDistanceCoefficientUsingAlgebraicForm</span> <span class="s">{</span>
1225   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1226   <span class="k">my</span><span class="s">(</span><span class="i">$SumSquaresSubtractionXaiXbi</span><span class="s">)</span><span class="sc">;</span>
1227 
1228   <span class="i">$SumSquaresSubtractionXaiXbi</span> = <span class="i">_GetSumOfSquaresOfSubtractionOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1229 
1230   <span class="k">return</span> <span class="k">sqrt</span><span class="s">(</span><span class="i">$SumSquaresSubtractionXaiXbi</span><span class="s">)</span><span class="sc">;</span>
1231 <span class="s">}</span>
1232 
1233 <span class="c"># Calculate Euclidean distance coefficient using binary form...</span>
1234 <span class="c">#</span>
<a name="_EuclideanDistanceCoefficientUsingBinaryForm-"></a>1235 <span class="k">sub </span><span class="m">_EuclideanDistanceCoefficientUsingBinaryForm</span> <span class="s">{</span>
1236   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1237   <span class="k">my</span><span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="s">)</span><span class="sc">;</span>
1238 
1239   <span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="s">)</span> = <span class="i">_GetNumOfIndividualAndCommonSetBits</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1240 
1241   <span class="k">return</span>  <span class="s">(</span><span class="k">sqrt</span><span class="s">(</span><span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="n">2</span> * <span class="i">$Nc</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
1242 <span class="s">}</span>
1243 
1244 <span class="c"># Calculate Euclidean distance coefficient using set theoretic form...</span>
1245 <span class="c">#</span>
<a name="_EuclideanDistanceCoefficientUsingSetTheoreticForm-"></a>1246 <span class="k">sub </span><span class="m">_EuclideanDistanceCoefficientUsingSetTheoreticForm</span> <span class="s">{</span>
1247   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1248   <span class="k">my</span><span class="s">(</span><span class="i">$SumMinXaiXbi</span><span class="cm">,</span> <span class="i">$SumXai</span><span class="cm">,</span> <span class="i">$SumXbi</span><span class="s">)</span><span class="sc">;</span>
1249 
1250   <span class="i">$SumXai</span> = <span class="i">_GetSumOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="s">)</span><span class="sc">;</span>
1251   <span class="i">$SumXbi</span> = <span class="i">_GetSumOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1252   <span class="i">$SumMinXaiXbi</span> = <span class="i">_GetSumOfMinimumOfFingerprintsOrderdedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1253 
1254   <span class="k">return</span>  <span class="s">(</span><span class="k">sqrt</span><span class="s">(</span><span class="i">$SumXai</span> + <span class="i">$SumXbi</span> - <span class="n">2</span> * <span class="i">$SumMinXaiXbi</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
1255 <span class="s">}</span>
1256 
1257 <span class="c"># Calculate Jaccard similarity cofficient between two fingerprint vectors.</span>
1258 <span class="c">#</span>
1259 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
1260 <span class="c">#</span>
<a name="JaccardSimilarityCoefficient-"></a>1261 <span class="k">sub </span><span class="m">JaccardSimilarityCoefficient ($$;$$)</span> <span class="s">{</span>
1262   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1263 
1264   <span class="k">return</span> <span class="i">TanimotoSimilarityCoefficient</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span><span class="sc">;</span>
1265 <span class="s">}</span>
1266 
1267 <span class="c"># Calculate Tanimoto similarity cofficient between two fingerprint vectors.</span>
1268 <span class="c">#</span>
1269 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
1270 <span class="c">#</span>
<a name="TanimotoSimilarityCoefficient-"></a>1271 <span class="k">sub </span><span class="m">TanimotoSimilarityCoefficient ($$;$$)</span> <span class="s">{</span>
1272   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1273 
1274   <span class="i">$CalculationMode</span> = <span class="k">defined</span> <span class="i">$CalculationMode</span> ? <span class="i">$CalculationMode</span> <span class="co">:</span> <span class="q">&#39;AlgebraicForm&#39;</span><span class="sc">;</span>
1275   <span class="i">$SkipValuesCheck</span> = <span class="k">defined</span> <span class="i">$SkipValuesCheck</span> ? <span class="i">$SkipValuesCheck</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1276 
1277   <span class="c"># Validate and process fingerprints vectors for similarity calculations...</span>
1278   <span class="c">#</span>
1279   <span class="i">_ValidateAndProcessFingerprintsVectorsForSimilarityCalculation</span><span class="s">(</span><span class="q">&quot;TanimotoSimilarityCoefficient: Calculation failed&quot;</span><span class="cm">,</span> <span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span><span class="sc">;</span>
1280 
1281   <span class="c"># Perform the calculation...</span>
1282   <span class="k">if</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^AlgebraicForm$/i</span><span class="s">)</span> <span class="s">{</span>
1283     <span class="k">return</span> <span class="i">_TanimotoSimilarityCoefficientUsingAlgebraicForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1284   <span class="s">}</span>
1285   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^BinaryForm$/i</span><span class="s">)</span> <span class="s">{</span>
1286     <span class="k">return</span> <span class="i">_TanimotoSimilarityCoefficientUsingBinaryForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1287   <span class="s">}</span>
1288   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^SetTheoreticForm$/i</span><span class="s">)</span> <span class="s">{</span>
1289     <span class="k">return</span> <span class="i">_TanimotoSimilarityCoefficientUsingSetTheoreticForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1290   <span class="s">}</span>
1291   <span class="k">else</span> <span class="s">{</span>
1292     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
1293   <span class="s">}</span>
1294 <span class="s">}</span>
1295 
1296 <span class="c"># Calculate Tanimoto similarity coefficient using algebraic form...</span>
1297 <span class="c">#</span>
<a name="_TanimotoSimilarityCoefficientUsingAlgebraicForm-"></a>1298 <span class="k">sub </span><span class="m">_TanimotoSimilarityCoefficientUsingAlgebraicForm</span> <span class="s">{</span>
1299   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1300   <span class="k">my</span><span class="s">(</span><span class="i">$SumProductXaiXbi</span><span class="cm">,</span> <span class="i">$SumXai2</span><span class="cm">,</span> <span class="i">$SumXbi2</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span><span class="sc">;</span>
1301 
1302   <span class="i">$SumXai2</span> = <span class="i">_GetSumOfSquaresOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="s">)</span><span class="sc">;</span>
1303   <span class="i">$SumXbi2</span> = <span class="i">_GetSumOfSquaresOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1304   <span class="i">$SumProductXaiXbi</span> = <span class="i">_GetSumOfProductOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1305 
1306   <span class="i">$Numerator</span> = <span class="i">$SumProductXaiXbi</span><span class="sc">;</span>
1307   <span class="i">$Denominator</span> = <span class="i">$SumXai2</span> + <span class="i">$SumXbi2</span> - <span class="i">$SumProductXaiXbi</span><span class="sc">;</span>
1308 
1309   <span class="k">return</span>  <span class="i">$Denominator</span> ? <span class="s">(</span><span class="i">$Numerator</span>/<span class="i">$Denominator</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1310 <span class="s">}</span>
1311 
1312 <span class="c"># Calculate Tanimoto similarity coefficient using binary form...</span>
1313 <span class="c">#</span>
<a name="_TanimotoSimilarityCoefficientUsingBinaryForm-"></a>1314 <span class="k">sub </span><span class="m">_TanimotoSimilarityCoefficientUsingBinaryForm</span> <span class="s">{</span>
1315   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1316   <span class="k">my</span><span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span><span class="sc">;</span>
1317 
1318   <span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="s">)</span> = <span class="i">_GetNumOfIndividualAndCommonSetBits</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1319 
1320   <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span>
1321   <span class="i">$Denominator</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span><span class="sc">;</span>
1322 
1323   <span class="k">return</span>  <span class="i">$Denominator</span> ? <span class="s">(</span><span class="i">$Numerator</span>/<span class="i">$Denominator</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1324 <span class="s">}</span>
1325 
1326 <span class="c"># Calculate Tanimoto similarity coefficient using set theoretic form...</span>
1327 <span class="c">#</span>
<a name="_TanimotoSimilarityCoefficientUsingSetTheoreticForm-"></a>1328 <span class="k">sub </span><span class="m">_TanimotoSimilarityCoefficientUsingSetTheoreticForm</span> <span class="s">{</span>
1329   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1330   <span class="k">my</span><span class="s">(</span><span class="i">$SumMinXaiXbi</span><span class="cm">,</span> <span class="i">$SumXai</span><span class="cm">,</span> <span class="i">$SumXbi</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span><span class="sc">;</span>
1331 
1332   <span class="i">$SumXai</span> = <span class="i">_GetSumOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="s">)</span><span class="sc">;</span>
1333   <span class="i">$SumXbi</span> = <span class="i">_GetSumOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1334   <span class="i">$SumMinXaiXbi</span> = <span class="i">_GetSumOfMinimumOfFingerprintsOrderdedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1335 
1336   <span class="i">$Numerator</span> = <span class="i">$SumMinXaiXbi</span><span class="sc">;</span>
1337   <span class="i">$Denominator</span> = <span class="i">$SumXai</span> + <span class="i">$SumXbi</span> - <span class="i">$SumMinXaiXbi</span><span class="sc">;</span>
1338 
1339   <span class="k">return</span>  <span class="i">$Denominator</span> ? <span class="s">(</span><span class="i">$Numerator</span>/<span class="i">$Denominator</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1340 <span class="s">}</span>
1341 
1342 
1343 <span class="c"># Calculate Soergel distance coefficient between two fingerprint vectors.</span>
1344 <span class="c">#</span>
1345 <span class="c"># This functionality can be either invoked as a class function or an object method.</span>
1346 <span class="c">#</span>
<a name="SoergelDistanceCoefficient-"></a>1347 <span class="k">sub </span><span class="m">SoergelDistanceCoefficient ($$;$$)</span> <span class="s">{</span>
1348   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1349 
1350   <span class="i">$CalculationMode</span> = <span class="k">defined</span> <span class="i">$CalculationMode</span> ? <span class="i">$CalculationMode</span> <span class="co">:</span> <span class="q">&#39;AlgebraicForm&#39;</span><span class="sc">;</span>
1351   <span class="i">$SkipValuesCheck</span> = <span class="k">defined</span> <span class="i">$SkipValuesCheck</span> ? <span class="i">$SkipValuesCheck</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1352 
1353   <span class="c"># Validate and process fingerprints vectors for similarity calculations...</span>
1354   <span class="c">#</span>
1355   <span class="i">_ValidateAndProcessFingerprintsVectorsForSimilarityCalculation</span><span class="s">(</span><span class="q">&quot;SoergelDistanceCoefficient: Calculation failed&quot;</span><span class="cm">,</span> <span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span><span class="sc">;</span>
1356 
1357   <span class="c"># Perform the calculation...</span>
1358   <span class="k">if</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^AlgebraicForm$/i</span><span class="s">)</span> <span class="s">{</span>
1359     <span class="k">return</span> <span class="i">_SoergelDistanceCoefficientUsingAlgebraicForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1360   <span class="s">}</span>
1361   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^BinaryForm$/i</span><span class="s">)</span> <span class="s">{</span>
1362     <span class="k">return</span> <span class="i">_SoergelDistanceCoefficientUsingBinaryForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1363   <span class="s">}</span>
1364   <span class="k">elsif</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^SetTheoreticForm$/i</span><span class="s">)</span> <span class="s">{</span>
1365     <span class="k">return</span> <span class="i">_SoergelDistanceCoefficientUsingSetTheoreticForm</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1366   <span class="s">}</span>
1367   <span class="k">else</span> <span class="s">{</span>
1368     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span>
1369   <span class="s">}</span>
1370 <span class="s">}</span>
1371 
1372 <span class="c"># Calculate Soergel distance coefficientusing algebraic form...</span>
1373 <span class="c">#</span>
<a name="_SoergelDistanceCoefficientUsingAlgebraicForm-"></a>1374 <span class="k">sub </span><span class="m">_SoergelDistanceCoefficientUsingAlgebraicForm</span> <span class="s">{</span>
1375   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1376   <span class="k">my</span><span class="s">(</span><span class="i">$SumAbsSubtractionXaiXbi</span><span class="cm">,</span> <span class="i">$SumMaxXaiXbi</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span><span class="sc">;</span>
1377 
1378   <span class="i">$SumAbsSubtractionXaiXbi</span> = <span class="i">_GetSumOfAbsoluteValueOfSubtractionOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1379   <span class="i">$SumMaxXaiXbi</span> = <span class="i">_GetSumOfMaximumOfFingerprintsOrderdedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1380 
1381   <span class="i">$Numerator</span> = <span class="i">$SumAbsSubtractionXaiXbi</span><span class="sc">;</span>
1382   <span class="i">$Denominator</span> = <span class="i">$SumMaxXaiXbi</span><span class="sc">;</span>
1383 
1384   <span class="k">return</span>  <span class="i">$Denominator</span> ? <span class="s">(</span><span class="i">$Numerator</span>/<span class="i">$Denominator</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1385 <span class="s">}</span>
1386 
1387 <span class="c"># Calculate Soergel distance coefficient using binary form...</span>
1388 <span class="c">#</span>
<a name="_SoergelDistanceCoefficientUsingBinaryForm-"></a>1389 <span class="k">sub </span><span class="m">_SoergelDistanceCoefficientUsingBinaryForm</span> <span class="s">{</span>
1390   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1391   <span class="k">my</span><span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span><span class="sc">;</span>
1392 
1393   <span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="s">)</span> = <span class="i">_GetNumOfIndividualAndCommonSetBits</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1394 
1395   <span class="i">$Numerator</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="n">2</span> * <span class="i">$Nc</span><span class="sc">;</span>
1396   <span class="i">$Denominator</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span><span class="sc">;</span>
1397 
1398   <span class="k">return</span>  <span class="i">$Denominator</span> ? <span class="s">(</span><span class="i">$Numerator</span>/<span class="i">$Denominator</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1399 <span class="s">}</span>
1400 
1401 <span class="c"># Calculate SoergelDistanceCoefficient using set theoretic form...</span>
1402 <span class="c">#</span>
<a name="_SoergelDistanceCoefficientUsingSetTheoreticForm-"></a>1403 <span class="k">sub </span><span class="m">_SoergelDistanceCoefficientUsingSetTheoreticForm</span> <span class="s">{</span>
1404   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1405   <span class="k">my</span><span class="s">(</span><span class="i">$SumMinXaiXbi</span><span class="cm">,</span> <span class="i">$SumXai</span><span class="cm">,</span> <span class="i">$SumXbi</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="s">)</span><span class="sc">;</span>
1406 
1407   <span class="i">$SumXai</span> = <span class="i">_GetSumOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="s">)</span><span class="sc">;</span>
1408   <span class="i">$SumXbi</span> = <span class="i">_GetSumOfFingerprintsOrderedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1409   <span class="i">$SumMinXaiXbi</span> = <span class="i">_GetSumOfMinimumOfFingerprintsOrderdedValues</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1410 
1411   <span class="i">$Numerator</span> = <span class="i">$SumXai</span> + <span class="i">$SumXbi</span> - <span class="n">2</span> * <span class="i">$SumMinXaiXbi</span><span class="sc">;</span>
1412   <span class="i">$Denominator</span> = <span class="i">$SumXai</span> + <span class="i">$SumXbi</span> - <span class="i">$SumMinXaiXbi</span><span class="sc">;</span>
1413 
1414   <span class="k">return</span>  <span class="i">$Denominator</span> ? <span class="s">(</span><span class="i">$Numerator</span>/<span class="i">$Denominator</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1415 <span class="s">}</span>
1416 
1417 <span class="c"># Validate and process fingerprints vectors for similarity calculations...</span>
1418 <span class="c">#</span>
<a name="_ValidateAndProcessFingerprintsVectorsForSimilarityCalculation-"></a>1419 <span class="k">sub </span><span class="m">_ValidateAndProcessFingerprintsVectorsForSimilarityCalculation</span> <span class="s">{</span>
1420   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="cm">,</span> <span class="i">$SkipValuesCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1421 
1422   <span class="i">$CalculationMode</span> = <span class="k">defined</span> <span class="i">$CalculationMode</span> ? <span class="i">$CalculationMode</span> <span class="co">:</span> <span class="q">&#39;AlgebraicForm&#39;</span><span class="sc">;</span>
1423   <span class="i">$SkipValuesCheck</span> = <span class="k">defined</span> <span class="i">$SkipValuesCheck</span> ? <span class="i">$SkipValuesCheck</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1424 
1425   <span class="k">if</span> <span class="s">(</span>!<span class="i">$SkipValuesCheck</span><span class="s">)</span> <span class="s">{</span>
1426     <span class="i">_ValidateFingerprintsVectorsForSimilarityCalculation</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="s">)</span><span class="sc">;</span>
1427   <span class="s">}</span>
1428   <span class="i">_ProcessFingerprintsVectorsForSimilarityCalculation</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="s">)</span><span class="sc">;</span>
1429 <span class="s">}</span>
1430 
1431 <span class="c"># Make sure fingerprint vectors are good for performing similarity/distance calculation...</span>
1432 <span class="c">#</span>
<a name="_ValidateFingerprintsVectorsForSimilarityCalculation-"></a>1433 <span class="k">sub </span><span class="m">_ValidateFingerprintsVectorsForSimilarityCalculation</span> <span class="s">{</span>
1434   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1435 
1436   <span class="c"># Make sure both are fingerprint vectors..</span>
1437   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">IsFingerprintsVector</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="s">)</span> &amp;&amp; <span class="i">IsFingerprintsVector</span><span class="s">(</span><span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1438     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Both objects must be fingerprint vectors...&quot;</span><span class="sc">;</span>
1439   <span class="s">}</span>
1440 
1441   <span class="c"># Check types...</span>
1442   <span class="k">if</span> <span class="s">(</span><span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">Type</span>} <span class="k">ne</span> <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">Type</span>}<span class="s">)</span> <span class="s">{</span>
1443     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Type of first fingerprint vector, $FingerprintsVectorA-&gt;{Type}, must be same as type of second fingerprint vector, $FingerprintsVectorB-&gt;{Type}...&quot;</span><span class="sc">;</span>
1444   <span class="s">}</span>
1445 
1446   <span class="c"># Check calculation mode...</span>
1447   <span class="k">if</span> <span class="s">(</span><span class="i">$CalculationMode</span> !~ <span class="q">/^(AlgebraicForm|BinaryForm|SetTheoreticForm)$/i</span><span class="s">)</span> <span class="s">{</span>
1448     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Specified similarity calculation mode, $CalculationMode, is not valid. Supported values: AlgebraicForm, BinaryForm, and SetTheoreticForm...&quot;</span><span class="sc">;</span>
1449   <span class="s">}</span>
1450 
1451   <span class="c"># Check values and value IDs...</span>
1452   <span class="k">my</span><span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$NIDa</span><span class="cm">,</span> <span class="i">$NIDb</span><span class="s">)</span><span class="sc">;</span>
1453   <span class="i">$Na</span> = <span class="i">$FingerprintsVectorA</span><span class="i">-&gt;GetNumOfValues</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">$Nb</span> = <span class="i">$FingerprintsVectorB</span><span class="i">-&gt;GetNumOfValues</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1454   <span class="i">$NIDa</span> = <span class="i">$FingerprintsVectorA</span><span class="i">-&gt;GetNumOfValueIDs</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> <span class="i">$NIDb</span> = <span class="i">$FingerprintsVectorB</span><span class="i">-&gt;GetNumOfValueIDs</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1455 
1456   <span class="k">if</span> <span class="s">(</span><span class="i">$Na</span> == <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
1457     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Number of values in first fingerprint vector, $Na, must be &gt; 0 for fingerprint vector type $FingerprintsVectorA-&gt;{Type} ...&quot;</span><span class="sc">;</span>
1458   <span class="s">}</span>
1459   <span class="k">if</span> <span class="s">(</span><span class="i">$Nb</span> == <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
1460     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Number of values in second fingerprint vector, $Nb, must be &gt; 0 for fingerprint vector type $FingerprintsVectorB-&gt;{Type} ...&quot;</span><span class="sc">;</span>
1461   <span class="s">}</span>
1462 
1463   <span class="k">if</span> <span class="s">(</span><span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">Type</span>} =~ <span class="q">/^OrderedNumericalValues$/i</span><span class="s">)</span> <span class="s">{</span>
1464     <span class="k">if</span> <span class="s">(</span><span class="i">$Na</span> != <span class="i">$Nb</span><span class="s">)</span> <span class="s">{</span>
1465       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Number of values in first fingerprint vector, $Na, must be equal to number of values, $Nb, in second fingerprint vector for fingerprint vector types $FingerprintsVectorA-&gt;{Type} ...&quot;</span><span class="sc">;</span>
1466     <span class="s">}</span>
1467   <span class="s">}</span>
1468   <span class="k">elsif</span> <span class="s">(</span><span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">Type</span>} =~ <span class="q">/^NumericalValues$/i</span><span class="s">)</span> <span class="s">{</span>
1469     <span class="k">if</span> <span class="s">(</span><span class="i">$NIDa</span> == <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
1470       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Number of value IDs in first fingerprint vector, $NIDa, must be &gt; 0 for fingerprint vector type $FingerprintsVectorA-&gt;{Type} ...&quot;</span><span class="sc">;</span>
1471     <span class="s">}</span>
1472     <span class="k">if</span> <span class="s">(</span><span class="i">$NIDb</span> == <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
1473       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Number of value IDs in first fingerprint vector, $NIDb, must be &gt; 0 for fingerprint vector type $FingerprintsVectorB-&gt;{Type} ...&quot;</span><span class="sc">;</span>
1474     <span class="s">}</span>
1475 
1476     <span class="k">if</span> <span class="s">(</span><span class="i">$NIDa</span> != <span class="i">$Na</span><span class="s">)</span> <span class="s">{</span>
1477       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Number of value IDs in first fingerprint vector, $NIDa, must be equal to its number of values, $Na, for fingerprint vector type $FingerprintsVectorA-&gt;{Type} ...&quot;</span><span class="sc">;</span>
1478     <span class="s">}</span>
1479     <span class="k">if</span> <span class="s">(</span><span class="i">$NIDb</span> != <span class="i">$Nb</span><span class="s">)</span> <span class="s">{</span>
1480       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Number of value IDs in second fingerprint vector, $NIDb, must be equal to its number of values, $Nb, for fingerprint vector type $FingerprintsVectorA-&gt;{Type} ...&quot;</span><span class="sc">;</span>
1481     <span class="s">}</span>
1482   <span class="s">}</span>
1483   <span class="k">elsif</span> <span class="s">(</span><span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">Type</span>} =~ <span class="q">/^AlphaNumericalValues$/i</span><span class="s">)</span> <span class="s">{</span>
1484     <span class="k">if</span> <span class="s">(</span><span class="i">$NIDa</span> || <span class="i">$NIDb</span><span class="s">)</span> <span class="s">{</span>
1485       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: ValueIDs cann&#39;t be specified for fingerprint vector types $FingerprintsVectorA-&gt;{Type} ...&quot;</span><span class="sc">;</span>
1486     <span class="s">}</span>
1487   <span class="s">}</span>
1488   <span class="k">else</span> <span class="s">{</span>
1489     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Fingerprint vector types $FingerprintsVectorA-&gt;{Type} is not valid...&quot;</span><span class="sc">;</span>
1490   <span class="s">}</span>
1491 <span class="s">}</span>
1492 
1493 <span class="c"># Process fingerprints vectors for similarity calculation by generating vectors</span>
1494 <span class="c"># containing ordered list of values...</span>
1495 <span class="c">#</span>
<a name="_ProcessFingerprintsVectorsForSimilarityCalculation-"></a>1496 <span class="k">sub </span><span class="m">_ProcessFingerprintsVectorsForSimilarityCalculation</span> <span class="s">{</span>
1497   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="cm">,</span> <span class="i">$CalculationMode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1498 
1499   <span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>} = <span class="k">undef</span><span class="sc">;</span> <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">OrderedValuesRef</span>} = <span class="k">undef</span><span class="sc">;</span>
1500   <span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">BitVector</span>} = <span class="k">undef</span><span class="sc">;</span> <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">BitVector</span>} = <span class="k">undef</span><span class="sc">;</span>
1501 
1502   <span class="k">if</span> <span class="s">(</span><span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">Type</span>} =~ <span class="q">/^OrderedNumericalValues$/i</span><span class="s">)</span> <span class="s">{</span>
1503     <span class="i">_ProcessOrderedNumericalValuesFingerprintsVectorsForSimilarityCalculation</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1504   <span class="s">}</span>
1505   <span class="k">elsif</span> <span class="s">(</span><span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">Type</span>} =~ <span class="q">/^NumericalValues$/i</span><span class="s">)</span> <span class="s">{</span>
1506     <span class="i">_ProcessNumericalValuesFingerprintsVectorsForSimilarityCalculation</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1507   <span class="s">}</span>
1508   <span class="k">elsif</span> <span class="s">(</span><span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">Type</span>} =~ <span class="q">/^AlphaNumericalValues$/i</span><span class="s">)</span> <span class="s">{</span>
1509     <span class="i">_ProcessAlphaNumericalValuesFingerprintsVectorsForSimilarityCalculation</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1510   <span class="s">}</span>
1511   <span class="k">else</span> <span class="s">{</span>
1512     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Fingerprint vector types $FingerprintsVectorA-&gt;{Type} is not valid...&quot;</span><span class="sc">;</span>
1513   <span class="s">}</span>
1514   <span class="k">if</span> <span class="s">(</span><span class="i">$CalculationMode</span> =~ <span class="q">/^BinaryForm$/i</span><span class="s">)</span> <span class="s">{</span>
1515     <span class="i">_TransformFinalOrderedValuesIntoBitVectorsForSimilarityCalculation</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span><span class="sc">;</span>
1516   <span class="s">}</span>
1517 <span class="s">}</span>
1518 
1519 <span class="c"># Process fingerprints vectors with ordered numerical values for similarity calculations...</span>
1520 <span class="c">#</span>
<a name="_ProcessOrderedNumericalValuesFingerprintsVectorsForSimilarityCalculation-"></a>1521 <span class="k">sub </span><span class="m">_ProcessOrderedNumericalValuesFingerprintsVectorsForSimilarityCalculation</span> <span class="s">{</span>
1522   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1523 
1524   <span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>} = \<span class="i">@</span>{<span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
1525   <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">OrderedValuesRef</span>} = \<span class="i">@</span>{<span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
1526 <span class="s">}</span>
1527 
1528 <span class="c"># Process fingerprints vectors with numerical values for similarity calculations...</span>
1529 <span class="c">#</span>
<a name="_ProcessNumericalValuesFingerprintsVectorsForSimilarityCalculation-"></a>1530 <span class="k">sub </span><span class="m">_ProcessNumericalValuesFingerprintsVectorsForSimilarityCalculation</span> <span class="s">{</span>
1531   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1532 
1533   <span class="c"># Set up unique IDs and values map for each fingerprint vector...</span>
1534   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$ValueID</span><span class="cm">,</span> <span class="i">%UniqueFingerprintsVectorAValueIDValues</span><span class="cm">,</span> <span class="i">%UniqueFingerprintsVectorBValueIDValues</span><span class="cm">,</span> <span class="i">%UniqueFingerprintsVectorsValueIDs</span><span class="s">)</span><span class="sc">;</span>
1535 
1536   <span class="i">%UniqueFingerprintsVectorAValueIDValues</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1537   <span class="i">%UniqueFingerprintsVectorBValueIDValues</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1538   <span class="i">%UniqueFingerprintsVectorsValueIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1539 
1540   <span class="c"># Go over first vector...</span>
1541   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">ValueIDs</span>}}<span class="s">)</span> <span class="s">{</span>
1542     <span class="i">$ValueID</span> = <span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">ValueIDs</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1543     <span class="i">$Value</span> = <span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1544     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$UniqueFingerprintsVectorAValueIDValues</span>{<span class="i">$ValueID</span>}<span class="s">)</span> <span class="s">{</span>
1545       <span class="i">$UniqueFingerprintsVectorAValueIDValues</span>{<span class="i">$ValueID</span>} += <span class="i">$Value</span><span class="sc">;</span>
1546     <span class="s">}</span>
1547     <span class="k">else</span> <span class="s">{</span>
1548       <span class="i">$UniqueFingerprintsVectorAValueIDValues</span>{<span class="i">$ValueID</span>} = <span class="i">$Value</span><span class="sc">;</span>
1549     <span class="s">}</span>
1550     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$UniqueFingerprintsVectorsValueIDs</span>{<span class="i">$ValueID</span>}<span class="s">)</span> <span class="s">{</span>
1551       <span class="i">$UniqueFingerprintsVectorsValueIDs</span>{<span class="i">$ValueID</span>} = <span class="n">1</span><span class="sc">;</span>
1552     <span class="s">}</span>
1553   <span class="s">}</span>
1554 
1555   <span class="c"># Go over second vector...</span>
1556   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">ValueIDs</span>}}<span class="s">)</span> <span class="s">{</span>
1557     <span class="i">$ValueID</span> = <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">ValueIDs</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1558     <span class="i">$Value</span> = <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1559     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$UniqueFingerprintsVectorBValueIDValues</span>{<span class="i">$ValueID</span>}<span class="s">)</span> <span class="s">{</span>
1560       <span class="i">$UniqueFingerprintsVectorBValueIDValues</span>{<span class="i">$ValueID</span>} += <span class="i">$Value</span><span class="sc">;</span>
1561     <span class="s">}</span>
1562     <span class="k">else</span> <span class="s">{</span>
1563       <span class="i">$UniqueFingerprintsVectorBValueIDValues</span>{<span class="i">$ValueID</span>} = <span class="i">$Value</span><span class="sc">;</span>
1564     <span class="s">}</span>
1565     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$UniqueFingerprintsVectorsValueIDs</span>{<span class="i">$ValueID</span>}<span class="s">)</span> <span class="s">{</span>
1566       <span class="i">$UniqueFingerprintsVectorsValueIDs</span>{<span class="i">$ValueID</span>} = <span class="n">1</span><span class="sc">;</span>
1567     <span class="s">}</span>
1568   <span class="s">}</span>
1569 
1570   <span class="c"># Setup ordered values...</span>
1571   <span class="k">my</span><span class="s">(</span><span class="i">@UniqueOrderedValueIDs</span><span class="cm">,</span> <span class="i">@OrderedValuesA</span><span class="cm">,</span> <span class="i">@OrderedValuesB</span><span class="s">)</span><span class="sc">;</span>
1572 
1573   <span class="i">@UniqueOrderedValueIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1574   <span class="i">@UniqueOrderedValueIDs</span> = <span class="k">sort</span> <span class="k">keys</span> <span class="i">%UniqueFingerprintsVectorsValueIDs</span><span class="sc">;</span>
1575 
1576   <span class="i">@OrderedValuesA</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1577   <span class="i">@OrderedValuesA</span> = <span class="k">map</span> <span class="s">{</span> <span class="k">exists</span> <span class="i">$UniqueFingerprintsVectorAValueIDValues</span>{<span class="i">$_</span>} ? <span class="i">$UniqueFingerprintsVectorAValueIDValues</span>{<span class="i">$_</span>} <span class="co">:</span> <span class="n">0</span> <span class="s">}</span> <span class="i">@UniqueOrderedValueIDs</span><span class="sc">;</span>
1578 
1579   <span class="i">@OrderedValuesB</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1580   <span class="i">@OrderedValuesB</span> = <span class="k">map</span> <span class="s">{</span> <span class="k">exists</span> <span class="i">$UniqueFingerprintsVectorBValueIDValues</span>{<span class="i">$_</span>} ? <span class="i">$UniqueFingerprintsVectorBValueIDValues</span>{<span class="i">$_</span>} <span class="co">:</span> <span class="n">0</span> <span class="s">}</span> <span class="i">@UniqueOrderedValueIDs</span><span class="sc">;</span>
1581 
1582   <span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>} = \<span class="i">@OrderedValuesA</span><span class="sc">;</span>
1583   <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">OrderedValuesRef</span>} = \<span class="i">@OrderedValuesB</span><span class="sc">;</span>
1584 <span class="s">}</span>
1585 
1586 <span class="c"># Process fingerprints vectors with allpha numerical values for similarity calculations...</span>
1587 <span class="c">#</span>
<a name="_ProcessAlphaNumericalValuesFingerprintsVectorsForSimilarityCalculation-"></a>1588 <span class="k">sub </span><span class="m">_ProcessAlphaNumericalValuesFingerprintsVectorsForSimilarityCalculation</span> <span class="s">{</span>
1589   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1590 
1591   <span class="c"># Set up unique IDs and values map for each vector...</span>
1592   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$ValueID</span><span class="cm">,</span> <span class="i">%UniqueFingerprintsVectorAValuesCount</span><span class="cm">,</span> <span class="i">%UniqueFingerprintsVectorBValuesCount</span><span class="cm">,</span> <span class="i">%UniqueFingerprintsVectorsValues</span><span class="s">)</span><span class="sc">;</span>
1593 
1594   <span class="i">%UniqueFingerprintsVectorAValuesCount</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1595   <span class="i">%UniqueFingerprintsVectorBValuesCount</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1596   <span class="i">%UniqueFingerprintsVectorsValues</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1597 
1598   <span class="c"># Go over first vector...</span>
1599   <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">Values</span>}}<span class="s">)</span> <span class="s">{</span>
1600     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$UniqueFingerprintsVectorAValuesCount</span>{<span class="i">$Value</span>}<span class="s">)</span> <span class="s">{</span>
1601       <span class="i">$UniqueFingerprintsVectorAValuesCount</span>{<span class="i">$Value</span>} += <span class="n">1</span><span class="sc">;</span>
1602     <span class="s">}</span>
1603     <span class="k">else</span> <span class="s">{</span>
1604       <span class="i">$UniqueFingerprintsVectorAValuesCount</span>{<span class="i">$Value</span>} = <span class="n">1</span><span class="sc">;</span>
1605     <span class="s">}</span>
1606     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$UniqueFingerprintsVectorsValues</span>{<span class="i">$Value</span>}<span class="s">)</span> <span class="s">{</span>
1607       <span class="i">$UniqueFingerprintsVectorsValues</span>{<span class="i">$Value</span>} = <span class="n">1</span><span class="sc">;</span>
1608     <span class="s">}</span>
1609   <span class="s">}</span>
1610 
1611   <span class="c"># Go over second vector...</span>
1612   <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">Values</span>}}<span class="s">)</span> <span class="s">{</span>
1613     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$UniqueFingerprintsVectorBValuesCount</span>{<span class="i">$Value</span>}<span class="s">)</span> <span class="s">{</span>
1614       <span class="i">$UniqueFingerprintsVectorBValuesCount</span>{<span class="i">$Value</span>} += <span class="n">1</span><span class="sc">;</span>
1615     <span class="s">}</span>
1616     <span class="k">else</span> <span class="s">{</span>
1617       <span class="i">$UniqueFingerprintsVectorBValuesCount</span>{<span class="i">$Value</span>} = <span class="n">1</span><span class="sc">;</span>
1618     <span class="s">}</span>
1619     <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$UniqueFingerprintsVectorsValues</span>{<span class="i">$Value</span>}<span class="s">)</span> <span class="s">{</span>
1620       <span class="i">$UniqueFingerprintsVectorsValues</span>{<span class="i">$Value</span>} = <span class="n">1</span><span class="sc">;</span>
1621     <span class="s">}</span>
1622   <span class="s">}</span>
1623 
1624   <span class="c"># Setup ordered values...</span>
1625   <span class="k">my</span><span class="s">(</span><span class="i">@UniqueOrderedValueIDs</span><span class="cm">,</span> <span class="i">@OrderedValuesA</span><span class="cm">,</span> <span class="i">@OrderedValuesB</span><span class="s">)</span><span class="sc">;</span>
1626 
1627   <span class="i">@UniqueOrderedValueIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1628   <span class="i">@UniqueOrderedValueIDs</span> = <span class="k">sort</span> <span class="k">keys</span> <span class="i">%UniqueFingerprintsVectorsValues</span><span class="sc">;</span>
1629 
1630   <span class="i">@OrderedValuesA</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1631   <span class="i">@OrderedValuesA</span> = <span class="k">map</span> <span class="s">{</span> <span class="k">exists</span> <span class="i">$UniqueFingerprintsVectorAValuesCount</span>{<span class="i">$_</span>} ? <span class="i">$UniqueFingerprintsVectorAValuesCount</span>{<span class="i">$_</span>} <span class="co">:</span> <span class="n">0</span> <span class="s">}</span> <span class="i">@UniqueOrderedValueIDs</span><span class="sc">;</span>
1632 
1633   <span class="i">@OrderedValuesB</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1634   <span class="i">@OrderedValuesB</span> = <span class="k">map</span> <span class="s">{</span> <span class="k">exists</span> <span class="i">$UniqueFingerprintsVectorBValuesCount</span>{<span class="i">$_</span>} ? <span class="i">$UniqueFingerprintsVectorBValuesCount</span>{<span class="i">$_</span>} <span class="co">:</span> <span class="n">0</span> <span class="s">}</span> <span class="i">@UniqueOrderedValueIDs</span><span class="sc">;</span>
1635 
1636   <span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>} = \<span class="i">@OrderedValuesA</span><span class="sc">;</span>
1637   <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">OrderedValuesRef</span>} = \<span class="i">@OrderedValuesB</span><span class="sc">;</span>
1638 
1639 <span class="s">}</span>
1640 
1641 <span class="c"># Transform final ordered values array into a BitVector for similarity calculation...</span>
1642 <span class="c">#</span>
<a name="_TransformFinalOrderedValuesIntoBitVectorsForSimilarityCalculation-"></a>1643 <span class="k">sub </span><span class="m">_TransformFinalOrderedValuesIntoBitVectorsForSimilarityCalculation</span> <span class="s">{</span>
1644   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1645   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Size</span><span class="cm">,</span> <span class="i">$BitVectorA</span><span class="cm">,</span> <span class="i">$BitVectorB</span><span class="cm">,</span> <span class="i">$SkipCheck</span><span class="s">)</span><span class="sc">;</span>
1646 
1647   <span class="c"># Create bit vectors...</span>
1648   <span class="i">$Size</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>}}<span class="sc">;</span>
1649 
1650   <span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">BitVector</span>} = <span class="i">new</span> <span class="i">BitVector</span><span class="s">(</span><span class="i">$Size</span><span class="s">)</span><span class="sc">;</span>
1651   <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">BitVector</span>} = <span class="i">new</span> <span class="i">BitVector</span><span class="s">(</span><span class="i">$Size</span><span class="s">)</span><span class="sc">;</span>
1652 
1653   <span class="c"># Set bits...</span>
1654   <span class="i">$SkipCheck</span> = <span class="n">1</span><span class="sc">;</span>
1655   <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">$Size</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1656     <span class="k">if</span> <span class="s">(</span><span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span>
1657       <span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">BitVector</span>}<span class="i">-&gt;SetBit</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$SkipCheck</span><span class="s">)</span><span class="sc">;</span>
1658     <span class="s">}</span>
1659     <span class="k">if</span> <span class="s">(</span><span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">OrderedValuesRef</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span>
1660       <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">BitVector</span>}<span class="i">-&gt;SetBit</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$SkipCheck</span><span class="s">)</span><span class="sc">;</span>
1661     <span class="s">}</span>
1662   <span class="s">}</span>
1663 <span class="s">}</span>
1664 
1665 <span class="c"># Return sum of ordered vector values...</span>
1666 <span class="c">#</span>
<a name="_GetSumOfFingerprintsOrderedValues-"></a>1667 <span class="k">sub </span><span class="m">_GetSumOfFingerprintsOrderedValues</span> <span class="s">{</span>
1668   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintVector</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1669 
1670   <span class="k">return</span> <span class="i">StatisticsUtil::Sum</span><span class="s">(</span><span class="i">$FingerprintVector</span>-&gt;{<span class="w">OrderedValuesRef</span>}<span class="s">)</span><span class="sc">;</span>
1671 <span class="s">}</span>
1672 
1673 <span class="c"># Return sum of squared ordered vector values...</span>
1674 <span class="c">#</span>
<a name="_GetSumOfSquaresOfFingerprintsOrderedValues-"></a>1675 <span class="k">sub </span><span class="m">_GetSumOfSquaresOfFingerprintsOrderedValues</span> <span class="s">{</span>
1676   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintVector</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1677 
1678   <span class="k">return</span> <span class="i">StatisticsUtil::SumOfSquares</span><span class="s">(</span><span class="i">$FingerprintVector</span>-&gt;{<span class="w">OrderedValuesRef</span>}<span class="s">)</span><span class="sc">;</span>
1679 <span class="s">}</span>
1680 
1681 <span class="c"># Return sum of product of correponding ordered vector values...</span>
1682 <span class="c">#</span>
<a name="_GetSumOfProductOfFingerprintsOrderedValues-"></a>1683 <span class="k">sub </span><span class="m">_GetSumOfProductOfFingerprintsOrderedValues</span> <span class="s">{</span>
1684   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1685   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$SumProductXaiXbi</span><span class="s">)</span><span class="sc">;</span>
1686 
1687   <span class="i">$SumProductXaiXbi</span> = <span class="n">0</span><span class="sc">;</span>
1688   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>}}<span class="s">)</span> <span class="s">{</span>
1689     <span class="i">$SumProductXaiXbi</span> += <span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>}[<span class="i">$Index</span>] * <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">OrderedValuesRef</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1690   <span class="s">}</span>
1691   <span class="k">return</span> <span class="i">$SumProductXaiXbi</span><span class="sc">;</span>
1692 <span class="s">}</span>
1693 
1694 <span class="c"># Return sum of absolute value of subtraction of correponding ordered vector values...</span>
1695 <span class="c">#</span>
<a name="_GetSumOfAbsoluteValueOfSubtractionOfFingerprintsOrderedValues-"></a>1696 <span class="k">sub </span><span class="m">_GetSumOfAbsoluteValueOfSubtractionOfFingerprintsOrderedValues</span> <span class="s">{</span>
1697   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1698   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$SumAbsSubtractionXaiXbi</span><span class="s">)</span><span class="sc">;</span>
1699 
1700   <span class="i">$SumAbsSubtractionXaiXbi</span> = <span class="n">0</span><span class="sc">;</span>
1701   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>}}<span class="s">)</span> <span class="s">{</span>
1702     <span class="i">$SumAbsSubtractionXaiXbi</span> += <span class="k">abs</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>}[<span class="i">$Index</span>] - <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">OrderedValuesRef</span>}[<span class="i">$Index</span>]<span class="s">)</span><span class="sc">;</span>
1703   <span class="s">}</span>
1704   <span class="k">return</span> <span class="i">$SumAbsSubtractionXaiXbi</span><span class="sc">;</span>
1705 <span class="s">}</span>
1706 
1707 <span class="c"># Return sum of squares of subtraction of correponding ordered vector values...</span>
1708 <span class="c">#</span>
<a name="_GetSumOfSquaresOfSubtractionOfFingerprintsOrderedValues-"></a>1709 <span class="k">sub </span><span class="m">_GetSumOfSquaresOfSubtractionOfFingerprintsOrderedValues</span> <span class="s">{</span>
1710   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1711   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$SumSquaresSubtractionXaiXbi</span><span class="s">)</span><span class="sc">;</span>
1712 
1713   <span class="i">$SumSquaresSubtractionXaiXbi</span> = <span class="n">0</span><span class="sc">;</span>
1714   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>}}<span class="s">)</span> <span class="s">{</span>
1715     <span class="i">$SumSquaresSubtractionXaiXbi</span> += <span class="s">(</span><span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>}[<span class="i">$Index</span>] - <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">OrderedValuesRef</span>}[<span class="i">$Index</span>]<span class="s">)</span>**<span class="n">2</span><span class="sc">;</span>
1716   <span class="s">}</span>
1717   <span class="k">return</span> <span class="i">$SumSquaresSubtractionXaiXbi</span><span class="sc">;</span>
1718 <span class="s">}</span>
1719 
1720 <span class="c"># Return sum of minimum of correponding ordered vector values...</span>
1721 <span class="c">#</span>
<a name="_GetSumOfMinimumOfFingerprintsOrderdedValues-"></a>1722 <span class="k">sub </span><span class="m">_GetSumOfMinimumOfFingerprintsOrderdedValues</span> <span class="s">{</span>
1723   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1724   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$SumMinXaiXbi</span><span class="s">)</span><span class="sc">;</span>
1725 
1726   <span class="i">$SumMinXaiXbi</span> = <span class="n">0</span><span class="sc">;</span>
1727   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>}}<span class="s">)</span> <span class="s">{</span>
1728     <span class="i">$SumMinXaiXbi</span> += <span class="i">MathUtil::min</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>}[<span class="i">$Index</span>]<span class="cm">,</span> <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">OrderedValuesRef</span>}[<span class="i">$Index</span>]<span class="s">)</span><span class="sc">;</span>
1729   <span class="s">}</span>
1730   <span class="k">return</span> <span class="i">$SumMinXaiXbi</span><span class="sc">;</span>
1731 <span class="s">}</span>
1732 
1733 <span class="c"># Return sum of maximum of correponding ordered vector values...</span>
1734 <span class="c">#</span>
<a name="_GetSumOfMaximumOfFingerprintsOrderdedValues-"></a>1735 <span class="k">sub </span><span class="m">_GetSumOfMaximumOfFingerprintsOrderdedValues</span> <span class="s">{</span>
1736   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1737   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$SumMaxXaiXbi</span><span class="s">)</span><span class="sc">;</span>
1738 
1739   <span class="i">$SumMaxXaiXbi</span> = <span class="n">0</span><span class="sc">;</span>
1740   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>}}<span class="s">)</span> <span class="s">{</span>
1741     <span class="i">$SumMaxXaiXbi</span> += <span class="i">MathUtil::max</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">OrderedValuesRef</span>}[<span class="i">$Index</span>]<span class="cm">,</span> <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">OrderedValuesRef</span>}[<span class="i">$Index</span>]<span class="s">)</span><span class="sc">;</span>
1742   <span class="s">}</span>
1743   <span class="k">return</span> <span class="i">$SumMaxXaiXbi</span><span class="sc">;</span>
1744 <span class="s">}</span>
1745 
1746 <span class="c"># Get number of Na, Nb and Nc bits in vector A and B for BinaryForm calculation...</span>
1747 <span class="c">#</span>
<a name="_GetNumOfIndividualAndCommonSetBits-"></a>1748 <span class="k">sub </span><span class="m">_GetNumOfIndividualAndCommonSetBits ($$)</span> <span class="s">{</span>
1749   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1750   <span class="k">my</span><span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="cm">,</span> <span class="i">$Nd</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span>
1751 
1752   <span class="i">$FingerprintsBitVectorA</span> = <span class="i">$FingerprintsVectorA</span>-&gt;{<span class="w">BitVector</span>}<span class="sc">;</span>
1753   <span class="i">$FingerprintsBitVectorB</span> = <span class="i">$FingerprintsVectorB</span>-&gt;{<span class="w">BitVector</span>}<span class="sc">;</span>
1754 
1755   <span class="c"># Number of bits set to &quot;1&quot; in A</span>
1756   <span class="i">$Na</span> = <span class="i">$FingerprintsBitVectorA</span><span class="i">-&gt;GetNumOfSetBits</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1757 
1758   <span class="c"># Number of bits set to &quot;1&quot; in B</span>
1759   <span class="i">$Nb</span> = <span class="i">$FingerprintsBitVectorB</span><span class="i">-&gt;GetNumOfSetBits</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1760 
1761   <span class="c"># Number of bits set to &quot;1&quot; in both A and B</span>
1762   <span class="k">my</span><span class="s">(</span><span class="i">$NcBitVector</span><span class="s">)</span><span class="sc">;</span>
1763   <span class="i">$NcBitVector</span> = <span class="i">$FingerprintsBitVectorA</span> &amp; <span class="i">$FingerprintsBitVectorB</span><span class="sc">;</span>
1764   <span class="i">$Nc</span> = <span class="i">$NcBitVector</span><span class="i">-&gt;GetNumOfSetBits</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1765 
1766   <span class="k">return</span> <span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="cm">,</span> <span class="i">$Nc</span><span class="s">)</span><span class="sc">;</span>
1767 <span class="s">}</span>
1768 
1769 <span class="c"># Return a list of supported distance coefficients...</span>
1770 <span class="c">#</span>
<a name="GetSupportedDistanceCoefficients-"></a>1771 <span class="k">sub </span><span class="m">GetSupportedDistanceCoefficients ()</span> <span class="s">{</span>
1772 
1773   <span class="k">return</span> <span class="i">@DistanceCoefficients</span><span class="sc">;</span>
1774 <span class="s">}</span>
1775 
1776 <span class="c"># Return a list of supported similarity coefficients...</span>
1777 <span class="c">#</span>
<a name="GetSupportedSimilarityCoefficients-"></a>1778 <span class="k">sub </span><span class="m">GetSupportedSimilarityCoefficients ()</span> <span class="s">{</span>
1779 
1780   <span class="k">return</span> <span class="i">@SimilarityCoefficients</span><span class="sc">;</span>
1781 <span class="s">}</span>
1782 
1783 <span class="c"># Return a list of supported distance and similarity coefficients...</span>
1784 <span class="c">#</span>
<a name="GetSupportedDistanceAndSimilarityCoefficients-"></a>1785 <span class="k">sub </span><span class="m">GetSupportedDistanceAndSimilarityCoefficients ()</span> <span class="s">{</span>
1786   <span class="k">my</span><span class="s">(</span><span class="i">@DistanceAndSimilarityCoefficients</span><span class="s">)</span><span class="sc">;</span>
1787 
1788   <span class="i">@DistanceAndSimilarityCoefficients</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1789   <span class="k">push</span> <span class="i">@DistanceAndSimilarityCoefficients</span><span class="cm">,</span> <span class="i">@DistanceCoefficients</span><span class="sc">;</span>
1790   <span class="k">push</span> <span class="i">@DistanceAndSimilarityCoefficients</span><span class="cm">,</span> <span class="i">@SimilarityCoefficients</span><span class="sc">;</span>
1791 
1792   <span class="k">return</span> <span class="k">sort</span> <span class="i">@DistanceAndSimilarityCoefficients</span><span class="sc">;</span>
1793 <span class="s">}</span>
1794 
1795 <span class="c"># Is it a fingerprints vector object?</span>
<a name="IsFingerprintsVector-"></a>1796 <span class="k">sub </span><span class="m">IsFingerprintsVector ($)</span> <span class="s">{</span>
1797   <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>
1798 
1799   <span class="k">return</span> <span class="i">_IsFingerprintsVector</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span><span class="sc">;</span>
1800 <span class="s">}</span>
1801 
1802 <span class="c"># Is it a fingerprints vector object?</span>
<a name="_IsFingerprintsVector-"></a>1803 <span class="k">sub </span><span class="m">_IsFingerprintsVector</span> <span class="s">{</span>
1804   <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>
1805 
1806   <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>
1807 <span class="s">}</span>
1808 
1809 <span class="c"># Return a string containing vector values...</span>
<a name="StringifyFingerprintsVector-"></a>1810 <span class="k">sub </span><span class="m">StringifyFingerprintsVector</span> <span class="s">{</span>
1811   <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>
1812   <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsVectorString</span><span class="s">)</span><span class="sc">;</span>
1813 
1814   <span class="c"># Set type, values and value IDs...</span>
1815   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfValues</span><span class="cm">,</span> <span class="i">$ValuesString</span><span class="cm">,</span> <span class="i">$NumOfValueIDs</span><span class="cm">,</span> <span class="i">$ValueIDsString</span><span class="cm">,</span> <span class="i">$MaxValuesToStringify</span><span class="s">)</span><span class="sc">;</span>
1816 
1817   <span class="i">$NumOfValues</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfValues</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1818   <span class="i">$MaxValuesToStringify</span> = <span class="n">500</span><span class="sc">;</span>
1819 
1820   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfValues</span> &lt; <span class="i">$MaxValuesToStringify</span><span class="s">)</span> <span class="s">{</span>
1821     <span class="c"># Append all values...</span>
1822     <span class="i">$ValuesString</span> = <span class="i">$NumOfValues</span> ? <span class="k">join</span> <span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}} <span class="co">:</span> <span class="q">&#39;None&#39;</span><span class="sc">;</span>
1823   <span class="s">}</span>
1824   <span class="k">else</span> <span class="s">{</span>
1825     <span class="c"># Truncate values...</span>
1826     <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
1827     <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">$MaxValuesToStringify</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1828       <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1829     <span class="s">}</span>
1830     <span class="i">$ValuesString</span> = <span class="k">join</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span> . <span class="q">&quot; ...&quot;</span><span class="sc">;</span>
1831   <span class="s">}</span>
1832 
1833   <span class="i">$NumOfValueIDs</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfValueIDs</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1834   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfValueIDs</span> &lt; <span class="i">$MaxValuesToStringify</span><span class="s">)</span> <span class="s">{</span>
1835     <span class="c"># Append all valueIDs...</span>
1836     <span class="i">$ValueIDsString</span> = <span class="i">$NumOfValueIDs</span> ? <span class="k">join</span> <span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}} <span class="co">:</span> <span class="q">&#39;None&#39;</span><span class="sc">;</span>
1837   <span class="s">}</span>
1838   <span class="k">else</span> <span class="s">{</span>
1839     <span class="c"># Truncate value IDs...</span>
1840     <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">@ValueIDs</span><span class="s">)</span><span class="sc">;</span>
1841     <span class="i">@ValueIDs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1842     <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">$MaxValuesToStringify</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1843       <span class="k">push</span> <span class="i">@ValueIDs</span><span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">ValueIDs</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1844     <span class="s">}</span>
1845     <span class="i">$ValueIDsString</span> = <span class="k">join</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@ValueIDs</span><span class="s">)</span> . <span class="q">&quot; ...&quot;</span><span class="sc">;</span>
1846   <span class="s">}</span>
1847 
1848   <span class="i">$FingerprintsVectorString</span> = <span class="q">&quot;Type: $This-&gt;{Type}; NumOfValues: $NumOfValues&quot;</span><span class="sc">;</span>
1849   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Type</span>} =~ <span class="q">/^(OrderedNumericalValues|NumericalValues)$/i</span><span class="s">)</span> <span class="s">{</span>
1850     <span class="k">my</span><span class="s">(</span><span class="i">$NumOfNonZeroValues</span><span class="s">)</span><span class="sc">;</span>
1851     <span class="i">$NumOfNonZeroValues</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfNonZeroValues</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1852     <span class="i">$FingerprintsVectorString</span> .= <span class="q">&quot;; NumOfNonZeroValues: $NumOfNonZeroValues&quot;</span><span class="sc">;</span>
1853   <span class="s">}</span>
1854 
1855   <span class="c"># Append all the values and value IDs...</span>
1856   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfValues</span> &lt; <span class="i">$MaxValuesToStringify</span><span class="s">)</span> <span class="s">{</span>
1857     <span class="i">$FingerprintsVectorString</span> .= <span class="q">&quot;; Values: &lt;$ValuesString&gt;; NumOfValueIDs: $NumOfValueIDs; ValueIDs: &lt;$ValueIDsString&gt;&quot;</span><span class="sc">;</span>
1858   <span class="s">}</span>
1859   <span class="k">else</span> <span class="s">{</span>
1860     <span class="i">$FingerprintsVectorString</span> .= <span class="q">&quot;; Values (Truncated after $MaxValuesToStringify): &lt;$ValuesString&gt;; NumOfValueIDs: $NumOfValueIDs; ValueIDs (Truncated after $MaxValuesToStringify): &lt;$ValueIDsString&gt;&quot;</span><span class="sc">;</span>
1861   <span class="s">}</span>
1862 
1863   <span class="k">return</span> <span class="i">$FingerprintsVectorString</span><span class="sc">;</span>
1864 <span class="s">}</span>
1865 
<a name="EOF-"></a></pre>
<p>&nbsp;</p>
<br />
<center>
<img src="../../../images/h2o2.png">
</center>
</body>
</html>