Mercurial > repos > deepakjadmin > mayatool3_test3
view mayachemtools/docs/modules/html/code/FingerprintsBitVector.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::FingerprintsBitVector.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::FingerprintsBitVector-"></a> 1 <span class="k">package </span><span class="i">Fingerprints::FingerprintsBitVector</span><span class="sc">;</span> 2 <span class="c">#</span> 3 <span class="c"># $RCSfile: FingerprintsBitVector.pm,v $</span> 4 <span class="c"># $Date: 2015/02/28 20:48:54 $</span> 5 <span class="c"># $Revision: 1.27 $</span> 6 <span class="c">#</span> 7 <span class="c"># Author: Manish Sud <msud@san.rr.com></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 <http://www.gnu.org/licenses/> 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">BitVector</span><span class="sc">;</span> 34 <span class="k">use</span> <span class="w">MathUtil</span><span class="sc">;</span> 35 <span class="k">use</span> <span class="w">TextUtil</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> 36 37 <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> 38 39 <span class="i">@ISA</span> = <span class="q">qw(BitVector Exporter)</span><span class="sc">;</span> 40 41 <span class="c"># Similiarity coefficients...</span> 42 <span class="k">my</span><span class="s">(</span><span class="i">@SimilarityCoefficients</span><span class="s">)</span> = <span class="q">qw(BaroniUrbaniSimilarityCoefficient BuserSimilarityCoefficient CosineSimilarityCoefficient DiceSimilarityCoefficient DennisSimilarityCoefficient ForbesSimilarityCoefficient FossumSimilarityCoefficient HamannSimilarityCoefficient JacardSimilarityCoefficient Kulczynski1SimilarityCoefficient Kulczynski2SimilarityCoefficient MatchingSimilarityCoefficient McConnaugheySimilarityCoefficient OchiaiSimilarityCoefficient PearsonSimilarityCoefficient RogersTanimotoSimilarityCoefficient RussellRaoSimilarityCoefficient SimpsonSimilarityCoefficient SkoalSneath1SimilarityCoefficient SkoalSneath2SimilarityCoefficient SkoalSneath3SimilarityCoefficient TanimotoSimilarityCoefficient TverskySimilarityCoefficient YuleSimilarityCoefficient WeightedTanimotoSimilarityCoefficient WeightedTverskySimilarityCoefficient)</span><span class="sc">;</span> 43 44 <span class="c"># New from string...</span> 45 <span class="k">my</span><span class="s">(</span><span class="i">@NewFromString</span><span class="s">)</span> = <span class="q">qw(NewFromBinaryString NewFromHexadecimalString NewFromRawBinaryString)</span><span class="sc">;</span> 46 47 <span class="i">@EXPORT</span> = <span class="q">qw(IsFingerprintsBitVector)</span><span class="sc">;</span> 48 <span class="i">@EXPORT_OK</span> = <span class="q">qw(GetSupportedSimilarityCoefficients @NewFromString @SimilarityCoefficients)</span><span class="sc">;</span> 49 50 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span> 51 <span class="w">new</span> <span class="cm">=></span> <span class="s">[</span><span class="i">@NewFromString</span><span class="s">]</span><span class="cm">,</span> 52 <span class="w">coefficients</span> <span class="cm">=></span> <span class="s">[</span><span class="i">@SimilarityCoefficients</span><span class="s">]</span><span class="cm">,</span> 53 <span class="w">all</span> <span class="cm">=></span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span> 54 <span class="s">)</span><span class="sc">;</span> 55 56 <span class="c"># Setup class variables...</span> 57 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="sc">;</span> 58 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 59 60 <span class="k">use</span> <span class="w">overload</span> <span class="q">'""'</span> <span class="cm">=></span> <span class="q">'StringifyFingerprintsBitVector'</span><span class="sc">;</span> 61 62 <span class="c"># Class constructor...</span> <a name="new-"></a> 63 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span> 64 <span class="k">my</span><span class="s">(</span><span class="i">$Class</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 65 66 <span class="c"># Initialize object...</span> 67 <span class="k">my</span> <span class="i">$This</span> = <span class="i">$Class</span><span class="i">->SUPER::new</span><span class="s">(</span><span class="i">$Size</span><span class="s">)</span><span class="sc">;</span> 68 <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> 69 <span class="i">$This</span><span class="i">->_InitializeFingerprintsBitVector</span><span class="s">(</span><span class="i">$Size</span><span class="s">)</span><span class="sc">;</span> 70 71 <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> 72 <span class="s">}</span> 73 74 <span class="c"># Initialize object data...</span> 75 <span class="c">#</span> 76 <span class="c"># Note:</span> 77 <span class="c"># . The class, BitVector, used to derive this class provides all the functionality to</span> 78 <span class="c"># manipulate bits.</span> 79 <span class="c"># . Irrespective of specified size, Perl functions used to handle bit data in</span> 80 <span class="c"># BitVector class automatically sets the size to the next nearest power of 2.</span> 81 <span class="c"># SpecifiedSize is used by this class to process any aribitray size during similarity</span> 82 <span class="c"># coefficient calculations.</span> 83 <span class="c">#</span> <a name="_InitializeFingerprintsBitVector-"></a> 84 <span class="k">sub </span><span class="m">_InitializeFingerprintsBitVector</span> <span class="s">{</span> 85 <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 86 87 <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Size</span><span class="s">)</span> <span class="s">{</span> 88 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->new: FingerprintsBitVector object instantiated without specifying its size ..."</span><span class="sc">;</span> 89 <span class="s">}</span> 90 <span class="k">if</span> <span class="s">(</span><span class="i">$Size</span> <=<span class="n">0</span><span class="s">)</span> <span class="s">{</span> 91 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->new: Fingerprints bit vector size, $Size, must be a positive integer..."</span><span class="sc">;</span> 92 <span class="s">}</span> 93 94 <span class="c"># Specified size of fingerprints...</span> 95 <span class="i">$This</span>->{<span class="w">SpecifiedSize</span>} = <span class="i">$Size</span><span class="sc">;</span> 96 97 <span class="s">}</span> 98 99 <span class="c"># Initialize class ...</span> <a name="_InitializeClass-"></a> 100 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span> 101 <span class="c">#Class name...</span> 102 <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span> 103 <span class="s">}</span> 104 105 <span class="c"># Set specified size...</span> 106 <span class="c">#</span> 107 <span class="c"># Notes:</span> 108 <span class="c"># Irrespective of specified size, Perl functions used to handle bit data in</span> 109 <span class="c"># BitVector class automatically sets the size to the next nearest power of 2.</span> 110 <span class="c"># SpecifiedSize is used by this class to process any aribitray size during similarity</span> 111 <span class="c"># coefficient calculations.</span> 112 <span class="c">#</span> <a name="SetSpecifiedSize-"></a> 113 <span class="k">sub </span><span class="m">SetSpecifiedSize</span> <span class="s">{</span> 114 <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$SpecifiedSize</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 115 116 <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$SpecifiedSize</span> > <span class="n">0</span> && <span class="i">$SpecifiedSize</span> <= <span class="i">$This</span>->{<span class="w">Size</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span> 117 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetSpecifiedSize: Specified size, $SpecifiedSize, is not valid: It must be > 0 && <= "</span><span class="cm">,</span> <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span><span class="q">" ..."</span><span class="sc">;</span> 118 <span class="s">}</span> 119 <span class="i">$This</span>->{<span class="w">SpecifiedSize</span>} = <span class="i">$SpecifiedSize</span><span class="sc">;</span> 120 <span class="s">}</span> 121 122 <span class="c"># Get specified size...</span> <a name="GetSpecifiedSize-"></a> 123 <span class="k">sub </span><span class="m">GetSpecifiedSize</span> <span class="s">{</span> 124 <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> 125 126 <span class="k">return</span> <span class="i">$This</span>->{<span class="w">SpecifiedSize</span>}<span class="sc">;</span> 127 <span class="s">}</span> 128 129 <span class="c"># Set ID...</span> <a name="SetID-"></a> 130 <span class="k">sub </span><span class="m">SetID</span> <span class="s">{</span> 131 <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> 132 133 <span class="i">$This</span>->{<span class="w">ID</span>} = <span class="i">$Value</span><span class="sc">;</span> 134 135 <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> 136 <span class="s">}</span> 137 138 <span class="c"># Get ID...</span> <a name="GetID-"></a> 139 <span class="k">sub </span><span class="m">GetID</span> <span class="s">{</span> 140 <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> 141 142 <span class="k">return</span> <span class="k">exists</span> <span class="i">$This</span>->{<span class="w">ID</span>} ? <span class="i">$This</span>->{<span class="w">ID</span>} <span class="co">:</span> <span class="q">'None'</span><span class="sc">;</span> 143 <span class="s">}</span> 144 145 <span class="c"># Set description...</span> <a name="SetDescription-"></a> 146 <span class="k">sub </span><span class="m">SetDescription</span> <span class="s">{</span> 147 <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> 148 149 <span class="i">$This</span>->{<span class="w">Description</span>} = <span class="i">$Value</span><span class="sc">;</span> 150 151 <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> 152 <span class="s">}</span> 153 154 <span class="c"># Get description...</span> <a name="GetDescription-"></a> 155 <span class="k">sub </span><span class="m">GetDescription</span> <span class="s">{</span> 156 <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> 157 158 <span class="k">return</span> <span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Description</span>} ? <span class="i">$This</span>->{<span class="w">Description</span>} <span class="co">:</span> <span class="q">'No description available'</span><span class="sc">;</span> 159 <span class="s">}</span> 160 161 <span class="c"># Set vector type...</span> <a name="SetVectorType-"></a> 162 <span class="k">sub </span><span class="m">SetVectorType</span> <span class="s">{</span> 163 <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> 164 165 <span class="i">$This</span>->{<span class="w">VectorType</span>} = <span class="i">$Value</span><span class="sc">;</span> 166 167 <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> 168 <span class="s">}</span> 169 170 <span class="c"># Get vector type...</span> <a name="GetVectorType-"></a> 171 <span class="k">sub </span><span class="m">GetVectorType</span> <span class="s">{</span> 172 <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> 173 174 <span class="k">return</span> <span class="k">exists</span> <span class="i">$This</span>->{<span class="w">VectorType</span>} ? <span class="i">$This</span>->{<span class="w">VectorType</span>} <span class="co">:</span> <span class="q">'FingerprintsBitVector'</span><span class="sc">;</span> 175 <span class="s">}</span> 176 177 <span class="c"># Create a new fingerprints bit vector using binary string. This functionality can be</span> 178 <span class="c"># either invoked as a class function or an object method.</span> 179 <span class="c">#</span> <a name="NewFromBinaryString-"></a> 180 <span class="k">sub </span><span class="m">NewFromBinaryString ($;$)</span> <span class="s">{</span> 181 <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">$ThirdParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 182 183 <span class="k">if</span> <span class="s">(</span><span class="i">_IsFingerprintsBitVector</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 184 <span class="k">return</span> <span class="i">_NewFingerptinsBitVectorFromString</span><span class="s">(</span><span class="q">'Binary'</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span><span class="sc">;</span> 185 <span class="s">}</span> 186 <span class="k">else</span> <span class="s">{</span> 187 <span class="k">return</span> <span class="i">_NewFingerptinsBitVectorFromString</span><span class="s">(</span> <span class="q">'Binary'</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> 188 <span class="s">}</span> 189 <span class="s">}</span> 190 191 <span class="c"># Create a new fingerprints bit vector using hexadecimal string. This functionality can be</span> 192 <span class="c"># either invoked as a class function or an object method.</span> 193 <span class="c">#</span> <a name="NewFromHexadecimalString-"></a> 194 <span class="k">sub </span><span class="m">NewFromHexadecimalString ($;$)</span> <span class="s">{</span> 195 <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">$ThirdParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 196 197 <span class="k">if</span> <span class="s">(</span><span class="i">_IsFingerprintsBitVector</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 198 <span class="k">return</span> <span class="i">_NewFingerptinsBitVectorFromString</span><span class="s">(</span><span class="q">'Hexadecimal'</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</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="k">return</span> <span class="i">_NewFingerptinsBitVectorFromString</span><span class="s">(</span> <span class="q">'Hexadecimal'</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="s">}</span> 204 205 <span class="c"># Create a new fingerprints bit vector using octal string. This functionality can be</span> 206 <span class="c"># either invoked as a class function or an object method.</span> 207 <span class="c">#</span> 208 <span class="c">#</span> <a name="NewFromOctalString-"></a> 209 <span class="k">sub </span><span class="m">NewFromOctalString ($)</span> <span class="s">{</span> 210 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->NewFromOctalString: Creation of fingerprits bit vector from an octal string is not supported ..."</span><span class="sc">;</span> 211 <span class="s">}</span> 212 213 <span class="c"># Create a new fingerprints bit vector using decimal string. This functionality can be</span> 214 <span class="c"># either invoked as a class function or an object method.</span> 215 <span class="c">#</span> <a name="NewFromDecimalString-"></a> 216 <span class="k">sub </span><span class="m">NewFromDecimalString ($;$)</span> <span class="s">{</span> 217 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->NewFromDecimalString: Creation of fingerprits bit vector from a decimal string is not supported ..."</span><span class="sc">;</span> 218 <span class="s">}</span> 219 220 <span class="c"># Create a new fingerprints bit vector using raw binary string. This functionality can be</span> 221 <span class="c"># either invoked as a class function or an object method.</span> 222 <span class="c">#</span> <a name="NewFromRawBinaryString-"></a> 223 <span class="k">sub </span><span class="m">NewFromRawBinaryString ($;$)</span> <span class="s">{</span> 224 <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">$ThirdParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 225 226 <span class="k">if</span> <span class="s">(</span><span class="i">_IsFingerprintsBitVector</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 227 <span class="k">return</span> <span class="i">_NewFingerptinsBitVectorFromString</span><span class="s">(</span><span class="q">'RawBinary'</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span><span class="sc">;</span> 228 <span class="s">}</span> 229 <span class="k">else</span> <span class="s">{</span> 230 <span class="k">return</span> <span class="i">_NewFingerptinsBitVectorFromString</span><span class="s">(</span> <span class="q">'RawBinary'</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> 231 <span class="s">}</span> 232 <span class="s">}</span> 233 234 <span class="c"># Create a new fingerprints bit vector from a string...</span> 235 <span class="c">#</span> 236 <span class="c">#</span> <a name="_NewFingerptinsBitVectorFromString-"></a> 237 <span class="k">sub </span><span class="m">_NewFingerptinsBitVectorFromString ($$;$)</span> <span class="s">{</span> 238 <span class="k">my</span><span class="s">(</span><span class="i">$Format</span><span class="cm">,</span> <span class="i">$String</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 239 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVector</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span><span class="sc">;</span> 240 241 <span class="i">$Size</span> = <span class="i">BitVector::_CalculateStringSizeInBits</span><span class="s">(</span><span class="i">$Format</span><span class="cm">,</span> <span class="i">$String</span><span class="s">)</span><span class="sc">;</span> 242 243 <span class="i">$FingerprintsBitVector</span> = <span class="i">new</span> <span class="i">Fingerprints::FingerprintsBitVector</span><span class="s">(</span><span class="i">$Size</span><span class="s">)</span><span class="sc">;</span> 244 <span class="i">$FingerprintsBitVector</span><span class="i">->_SetBitsAsString</span><span class="s">(</span><span class="i">$Format</span><span class="cm">,</span> <span class="i">$String</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="s">)</span><span class="sc">;</span> 245 246 <span class="k">return</span> <span class="i">$FingerprintsBitVector</span><span class="sc">;</span> 247 <span class="s">}</span> 248 249 <span class="c"># Get fingerprint bits as a hexadecimal string...</span> 250 <span class="c">#</span> <a name="GetBitsAsHexadecimalString-"></a> 251 <span class="k">sub </span><span class="m">GetBitsAsHexadecimalString</span> <span class="s">{</span> 252 <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 253 254 <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetFingerprintBitsAsString</span><span class="s">(</span><span class="q">'Hexadecimal'</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="s">)</span><span class="sc">;</span> 255 <span class="s">}</span> 256 257 <span class="c"># Get fingerprint bits as an octal string...</span> 258 <span class="c">#</span> <a name="GetBitsAsOctalString-"></a> 259 <span class="k">sub </span><span class="m">GetBitsAsOctalString</span> <span class="s">{</span> 260 <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 261 262 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->GetBitsAsOctalString: Retrieval of fingerprits bits as an octal string is not supported ..."</span><span class="sc">;</span> 263 <span class="s">}</span> 264 265 <span class="c"># Get fingerprint bits as an decimal string...</span> 266 <span class="c">#</span> <a name="GetBitsAsDecimalString-"></a> 267 <span class="k">sub </span><span class="m">GetBitsAsDecimalString</span> <span class="s">{</span> 268 <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 269 270 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->GetBitsAsOctalString: Retrieval of fingerprits bits as a decimal string is not supported ..."</span><span class="sc">;</span> 271 <span class="s">}</span> 272 273 <span class="c"># Get fingerprint bits as a binary string conatning 1s and 0s...</span> 274 <span class="c">#</span> <a name="GetBitsAsBinaryString-"></a> 275 <span class="k">sub </span><span class="m">GetBitsAsBinaryString</span> <span class="s">{</span> 276 <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 277 278 <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetFingerprintBitsAsString</span><span class="s">(</span><span class="q">'Binary'</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="s">)</span><span class="sc">;</span> 279 <span class="s">}</span> 280 281 <span class="c"># Get fingerprint bits as a binary string conatning 1s and 0s...</span> 282 <span class="c">#</span> <a name="GetBitsAsRawBinaryString-"></a> 283 <span class="k">sub </span><span class="m">GetBitsAsRawBinaryString</span> <span class="s">{</span> 284 <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> 285 286 <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetFingerprintBitsAsString</span><span class="s">(</span><span class="q">'RawBinary'</span><span class="s">)</span><span class="sc">;</span> 287 <span class="s">}</span> 288 289 <span class="c"># Return fingerprint bits as a string...</span> 290 <span class="c">#</span> <a name="_GetFingerprintBitsAsString-"></a> 291 <span class="k">sub </span><span class="m">_GetFingerprintBitsAsString</span> <span class="s">{</span> 292 <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Format</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 293 294 <span class="i">$BitsOrder</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$BitsOrder</span><span class="s">)</span> && <span class="i">$BitsOrder</span><span class="s">)</span> ? <span class="i">$BitsOrder</span> <span class="co">:</span> <span class="q">'Ascending'</span><span class="sc">;</span> 295 296 <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetBitsAsString</span><span class="s">(</span><span class="i">$Format</span><span class="cm">,</span> <span class="i">$BitsOrder</span><span class="s">)</span><span class="sc">;</span> 297 <span class="s">}</span> 298 299 <span class="c"># Is it a fingerprints bit vector object?</span> <a name="IsFingerprintsBitVector-"></a> 300 <span class="k">sub </span><span class="m">IsFingerprintsBitVector ($)</span> <span class="s">{</span> 301 <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> 302 303 <span class="k">return</span> <span class="i">_IsFingerprintsBitVector</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span><span class="sc">;</span> 304 <span class="s">}</span> 305 306 <span class="c"># Is it a fingerprints bit vector object?</span> <a name="_IsFingerprintsBitVector-"></a> 307 <span class="k">sub </span><span class="m">_IsFingerprintsBitVector</span> <span class="s">{</span> 308 <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> 309 310 <span class="k">return</span> <span class="s">(</span><span class="i">Scalar::Util::blessed</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> && <span class="i">$Object</span><span class="i">->isa</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> 311 <span class="s">}</span> 312 313 <span class="c"># Return a list of supported similarity coefficients...</span> <a name="GetSupportedSimilarityCoefficients-"></a> 314 <span class="k">sub </span><span class="m">GetSupportedSimilarityCoefficients ()</span> <span class="s">{</span> 315 316 <span class="k">return</span> <span class="i">@SimilarityCoefficients</span><span class="sc">;</span> 317 <span class="s">}</span> 318 319 <span class="c"># Get bit density for fingerprints bit vector corresponding to on bits...</span> 320 <span class="c">#</span> <a name="GetFingerprintsBitDensity-"></a> 321 <span class="k">sub </span><span class="m">GetFingerprintsBitDensity</span> <span class="s">{</span> 322 <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> 323 <span class="k">my</span><span class="s">(</span><span class="i">$BitDensity</span><span class="s">)</span><span class="sc">;</span> 324 325 <span class="i">$BitDensity</span> = <span class="i">$This</span><span class="i">->GetDensityOfSetBits</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 326 327 <span class="k">return</span> <span class="i">round</span><span class="s">(</span><span class="i">$BitDensity</span><span class="cm">,</span> <span class="n">2</span><span class="s">)</span><span class="sc">;</span> 328 <span class="s">}</span> 329 330 <span class="c"># Fold fingerprints bit vector by recursively reducing its size by half untill size is less than or equal to</span> 331 <span class="c"># specified size...</span> 332 <span class="c">#</span> <a name="FoldFingerprintsBitVectorBySize-"></a> 333 <span class="k">sub </span><span class="m">FoldFingerprintsBitVectorBySize</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">$Size</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 335 336 <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$Size</span> > <span class="n">0</span> && <span class="i">$Size</span> <= <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 337 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->FoldFingerprintsBitVectorBySize: Specified size, $Size, is not valid: It must be > 0 && <= "</span><span class="cm">,</span> <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span><span class="q">" ..."</span><span class="sc">;</span> 338 <span class="s">}</span> 339 340 <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> <= <span class="i">$Size</span><span class="s">)</span> <span class="s">{</span> 341 <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> 342 <span class="s">}</span> 343 <span class="k">return</span> <span class="i">$This</span><span class="i">->_FoldFingerprintsBitVector</span><span class="s">(</span><span class="q">'BySize'</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span><span class="sc">;</span> 344 <span class="s">}</span> 345 346 <span class="c"># Fold fingerprints bit vector by recursively reducing its size by half untill bit density of set bits is greater than</span> 347 <span class="c"># or equal to specified density...</span> 348 <span class="c">#</span> <a name="FoldFingerprintsBitVectorByDensity-"></a> 349 <span class="k">sub </span><span class="m">FoldFingerprintsBitVectorByDensity</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">$Density</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 351 352 <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$Density</span> > <span class="n">0</span> && <span class="i">$Density</span> <= <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 353 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->FoldFingerprintsBitVectorByDensity: Specified bit density, $Density, is not valid: It must be > 0 && <= 1 ..."</span><span class="sc">;</span> 354 <span class="s">}</span> 355 356 <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetDensityOfSetBits</span><span class="s">(</span><span class="s">)</span> >= <span class="i">$Density</span><span class="s">)</span> <span class="s">{</span> 357 <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> 358 <span class="s">}</span> 359 <span class="k">return</span> <span class="i">$This</span><span class="i">->_FoldFingerprintsBitVector</span><span class="s">(</span><span class="q">'ByDensity'</span><span class="cm">,</span> <span class="i">$Density</span><span class="s">)</span><span class="sc">;</span> 360 <span class="s">}</span> 361 362 <span class="c"># Fold fingerprints bit vector using size or density and return folded fingerprint bit vector...</span> 363 <span class="c">#</span> <a name="_FoldFingerprintsBitVector-"></a> 364 <span class="k">sub </span><span class="m">_FoldFingerprintsBitVector</span> <span class="s">{</span> 365 <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 366 367 <span class="c"># Fold upto size of 8 bits...</span> 368 <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> <= <span class="n">8</span><span class="s">)</span> <span class="s">{</span> 369 <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> 370 <span class="s">}</span> 371 372 <span class="c"># Check size or density....</span> 373 <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^BySize$/i</span><span class="s">)</span> <span class="s">{</span> 374 <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> <= <span class="i">$Value</span><span class="s">)</span> <span class="s">{</span> 375 <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> 376 <span class="s">}</span> 377 <span class="s">}</span> 378 <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^ByDensity$/i</span><span class="s">)</span> <span class="s">{</span> 379 <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetDensityOfSetBits</span><span class="s">(</span><span class="s">)</span> >= <span class="i">$Value</span><span class="s">)</span> <span class="s">{</span> 380 <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> 381 <span class="s">}</span> 382 <span class="s">}</span> 383 <span class="k">else</span> <span class="s">{</span> 384 <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> 385 <span class="s">}</span> 386 387 <span class="c"># Recursively reduce its size by half...</span> 388 <span class="k">my</span><span class="s">(</span><span class="i">$FirstHalfBinaryString</span><span class="cm">,</span> <span class="i">$SecondHalfBinaryString</span><span class="cm">,</span> <span class="i">$FirstHalfFingerprintsBitVector</span><span class="cm">,</span> <span class="i">$SecondHalfFingerprintsBitVector</span><span class="cm">,</span> <span class="i">$FoldedFingerprintsBitVector</span><span class="cm">,</span> <span class="i">$BinaryString</span><span class="cm">,</span> <span class="i">$StringLength</span><span class="s">)</span><span class="sc">;</span> 389 390 <span class="i">$BinaryString</span> = <span class="i">$This</span><span class="i">->GetBitsAsBinaryString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 391 <span class="i">$StringLength</span> = <span class="k">length</span> <span class="i">$BinaryString</span><span class="sc">;</span> 392 393 <span class="i">$FirstHalfBinaryString</span> = <span class="k">substr</span><span class="s">(</span><span class="i">$BinaryString</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$StringLength</span>/<span class="n">2</span><span class="s">)</span><span class="sc">;</span> 394 <span class="i">$SecondHalfBinaryString</span> = <span class="k">substr</span><span class="s">(</span><span class="i">$BinaryString</span><span class="cm">,</span> <span class="i">$StringLength</span>/<span class="n">2</span><span class="s">)</span><span class="sc">;</span> 395 396 <span class="i">$FirstHalfFingerprintsBitVector</span> = <span class="i">NewFromBinaryString</span><span class="s">(</span><span class="i">$FirstHalfBinaryString</span><span class="s">)</span><span class="sc">;</span> 397 <span class="i">$SecondHalfFingerprintsBitVector</span> = <span class="i">NewFromBinaryString</span><span class="s">(</span><span class="i">$SecondHalfBinaryString</span><span class="s">)</span><span class="sc">;</span> 398 399 <span class="i">$FoldedFingerprintsBitVector</span> = <span class="i">$FirstHalfFingerprintsBitVector</span> | <span class="i">$SecondHalfFingerprintsBitVector</span><span class="sc">;</span> 400 401 <span class="k">return</span> <span class="i">$FoldedFingerprintsBitVector</span><span class="i">->_FoldFingerprintsBitVector</span><span class="s">(</span><span class="i">$Mode</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> 402 <span class="s">}</span> 403 404 <span class="c"># Is first bit vector subset of second bit vector?</span> 405 <span class="c">#</span> 406 <span class="c"># For a bit vector to be a subset of another bit vector, both vectors must be of</span> 407 <span class="c"># the same size and the bit positions set in first vector must also be set in the</span> 408 <span class="c"># secons bit vector.</span> 409 <span class="c">#</span> 410 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 411 <span class="c">#</span> <a name="IsSubSet-"></a> 412 <span class="k">sub </span><span class="m">IsSubSet ($$)</span> <span class="s">{</span> 413 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 414 415 <span class="k">if</span> <span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="i">$FingerprintsBitVectorB</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 416 <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> 417 <span class="s">}</span> 418 <span class="k">my</span><span class="s">(</span><span class="i">$AndFingerprintsBitVector</span><span class="s">)</span><span class="sc">;</span> 419 420 <span class="i">$AndFingerprintsBitVector</span> = <span class="i">$FingerprintsBitVectorA</span> & <span class="i">$FingerprintsBitVectorB</span><span class="sc">;</span> 421 422 <span class="k">return</span> <span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="i">->GetNumOfSetBits</span><span class="s">(</span><span class="s">)</span> == <span class="i">$AndFingerprintsBitVector</span><span class="i">->GetNumOfSetBits</span><span class="s">(</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> 423 <span class="s">}</span> 424 425 <span class="c"># Return a string containing vector values...</span> <a name="StringifyFingerprintsBitVector-"></a> 426 <span class="k">sub </span><span class="m">StringifyFingerprintsBitVector</span> <span class="s">{</span> 427 <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> 428 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorString</span><span class="s">)</span><span class="sc">;</span> 429 430 <span class="c"># BitVector size information...</span> 431 <span class="c">#</span> 432 <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">SpecifiedSize</span>} != <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 433 <span class="i">$FingerprintsBitVectorString</span> = <span class="q">"SpecifiedSize: "</span> . <span class="i">$This</span>->{<span class="w">SpecifiedSize</span>} . <span class="q">"; BitVectorSize: "</span> . <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 434 <span class="s">}</span> 435 <span class="k">else</span> <span class="s">{</span> 436 <span class="i">$FingerprintsBitVectorString</span> = <span class="q">"BitVectorSize: "</span> . <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 437 <span class="s">}</span> 438 <span class="k">my</span><span class="s">(</span><span class="i">$NumOfSetBits</span><span class="cm">,</span> <span class="i">$BitDensity</span><span class="s">)</span><span class="sc">;</span> 439 <span class="i">$NumOfSetBits</span> = <span class="i">$This</span><span class="i">->GetNumOfSetBits</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 440 <span class="i">$BitDensity</span> = <span class="i">$This</span><span class="i">->GetFingerprintsBitDensity</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 441 442 <span class="i">$FingerprintsBitVectorString</span> .= <span class="q">"; NumOfOnBits: $NumOfSetBits; BitDensity: $BitDensity"</span><span class="sc">;</span> 443 444 <span class="c"># BitVector values...</span> 445 <span class="i">$FingerprintsBitVectorString</span> .= <span class="q">"; BitVector: "</span> . <span class="i">$This</span><span class="i">->StringifyBitVector</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 446 447 <span class="k">return</span> <span class="i">$FingerprintsBitVectorString</span><span class="sc">;</span> 448 <span class="s">}</span> 449 450 <span class="c"># For two fingerprints bit vectors A and B of same size, let:</span> 451 <span class="c">#</span> 452 <span class="c"># Na = Number of bits set to "1" in A</span> 453 <span class="c"># Nb = Number of bits set to "1" in B</span> 454 <span class="c"># Nc = Number of bits set to "1" in both A and B</span> 455 <span class="c"># Nd = Number of bits set to "0" in both A and B</span> 456 <span class="c">#</span> 457 <span class="c"># Nt = Number of bits set to "1" or "0" in A or B = Size of A or B = Na + Nb - Nc + Nd</span> 458 <span class="c">#</span> 459 <span class="c"># Na - Nc = Number of bits set to "1" in A but not in B</span> 460 <span class="c"># Nb - Nc = Number of bits set to "1" in B but not in A</span> 461 <span class="c">#</span> 462 <span class="c"># Various similarity coefficients [ Ref 40 - 42 ] for a pair of bit vectors A and B are</span> 463 <span class="c"># defined as follows:</span> 464 <span class="c">#</span> 465 <span class="c"># . BaroniUrbani: ( SQRT( Nc * Nd ) + Nc ) / ( SQRT ( Nc * Nd ) + Nc + ( Na - Nc ) + ( Nb - Nc ) ) ( same as Buser )</span> 466 <span class="c">#</span> 467 <span class="c"># . Buser: ( SQRT ( Nc * Nd ) + Nc ) / ( SQRT ( Nc * Nd ) + Nc + ( Na - Nc ) + ( Nb - Nc ) ) ( same as BaroniUrbani )</span> 468 <span class="c">#</span> 469 <span class="c"># . Cosine: Nc / SQRT ( Na * Nb ) (same as Ochiai)</span> 470 <span class="c">#</span> 471 <span class="c"># . Dice: (2 * Nc) / ( Na + Nb )</span> 472 <span class="c">#</span> 473 <span class="c"># . Dennis: ( Nc * Nd - ( ( Na - Nc ) * ( Nb - Nc ) ) ) / SQRT ( Nt * Na * Nb)</span> 474 <span class="c">#</span> 475 <span class="c"># . Forbes: ( Nt * Nc ) / ( Na * Nb )</span> 476 <span class="c">#</span> 477 <span class="c"># . Fossum: ( Nt * ( ( Nc - 1/2 ) ** 2 ) / ( Na * Nb )</span> 478 <span class="c">#</span> 479 <span class="c"># . Hamann: ( ( Nc + Nd ) - ( Na - Nc ) - ( Nb - Nc ) ) / Nt</span> 480 <span class="c">#</span> 481 <span class="c"># . Jaccard: Nc / ( ( Na - Nc) + ( Nb - Nc ) + Nc ) = Nc / ( Na + Nb - Nc ) (same as Tanimoto)</span> 482 <span class="c">#</span> 483 <span class="c"># . Kulczynski1: Nc / ( ( Na - Nc ) + ( Nb - Nc) ) = Nc / ( Na + Nb - 2Nc )</span> 484 <span class="c">#</span> 485 <span class="c"># . Kulczynski2: ( ( Nc / 2 ) * ( 2 * Nc + ( Na - Nc ) + ( Nb - Nc) ) ) / ( ( Nc + ( Na - Nc ) ) * ( Nc + ( Nb - Nc ) ) ) = 0.5 * ( Nc / Na + Nc / Nb )</span> 486 <span class="c">#</span> 487 <span class="c"># . Matching: ( Nc + Nd ) / Nt</span> 488 <span class="c">#</span> 489 <span class="c"># . McConnaughey: ( Nc ** 2 - ( Na - Nc ) * ( Nb - Nc) ) / ( Na * Nb )</span> 490 <span class="c">#</span> 491 <span class="c"># . Ochiai: Nc / SQRT ( Na * Nb ) (same as Cosine)</span> 492 <span class="c">#</span> 493 <span class="c"># . Pearson: ( ( Nc * Nd ) - ( ( Na - Nc ) * ( Nb - Nc ) ) / SQRT ( Na * Nb * ( Na - Nc + Nd ) * ( Nb - Nc + Nd ) )</span> 494 <span class="c">#</span> 495 <span class="c"># . RogersTanimoto: ( Nc + Nd ) / ( ( Na - Nc) + ( Nb - Nc) + Nt) = ( Nc + Nd ) / ( Na + Nb - 2Nc + Nt)</span> 496 <span class="c">#</span> 497 <span class="c"># . RussellRao: Nc / Nt</span> 498 <span class="c">#</span> 499 <span class="c"># . Simpson: Nc / MIN ( Na, Nb)</span> 500 <span class="c">#</span> 501 <span class="c"># . SkoalSneath1: Nc / ( Nc + 2 * ( Na - Nc) + 2 * ( Nb - Nc) ) = Nc / ( 2 * Na + 2 * Nb - 3 * Nc )</span> 502 <span class="c">#</span> 503 <span class="c"># . SkoalSneath2: ( 2 * Nc + 2 * Nd ) / ( Nc + Nd + Nt )</span> 504 <span class="c">#</span> 505 <span class="c"># . SkoalSneath3: ( Nc + Nd ) / ( ( Na - Nc ) + ( Nb - Nc ) ) = ( Nc + Nd ) / ( Na + Nb - 2 * Nc )</span> 506 <span class="c">#</span> 507 <span class="c"># . Tanimoto: Nc / ( ( Na - Nc) + ( Nb - Nc ) + Nc ) = Nc / ( Na + Nb - Nc ) (same as Jaccard)</span> 508 <span class="c">#</span> 509 <span class="c"># . Tversky: Nc / ( alpha * ( Na - Nc ) + ( 1 - alpha) * ( Nb - Nc) + Nc ) = Nc / ( alpha * ( Na - Nb ) + Nb)</span> 510 <span class="c">#</span> 511 <span class="c"># . Yule: ( ( Nc * Nd ) - ( ( Na - Nc ) * ( Nb - Nc ) ) ) / ( ( Nc * Nd ) + ( ( Na - Nc ) * ( Nb - Nc ) ) )</span> 512 <span class="c">#</span> 513 <span class="c">#</span> 514 <span class="c"># Values of Tanimoto/Jaccard and Tversky coefficients are dependent on only those bit which</span> 515 <span class="c"># are set to "1" in both A and B. In order to take into account all bit positions, modified versions</span> 516 <span class="c"># of Tanimoto [ Ref. 42 ] and Tversky [ Ref. 43 ] have been developed.</span> 517 <span class="c">#</span> 518 <span class="c"># Let:</span> 519 <span class="c">#</span> 520 <span class="c"># Na' = Number of bits set to "0" in A</span> 521 <span class="c"># Nb' = Number of bits set to "0" in B</span> 522 <span class="c"># Nc' = Number of bits set to "0" in both A and B</span> 523 <span class="c">#</span> 524 <span class="c"># . Tanimoto': Nc' / ( ( Na' - Nc') + ( Nb' - Nc' ) + Nc' ) = Nc' / ( Na' + Nb' - Nc' )</span> 525 <span class="c">#</span> 526 <span class="c"># . Tversky': Nc' / ( alpha * ( Na' - Nc' ) + ( 1 - alpha) * ( Nb' - Nc' ) + Nc' ) = Nc' / ( alpha * ( Na' - Nb' ) + Nb')</span> 527 <span class="c">#</span> 528 <span class="c"># Then:</span> 529 <span class="c">#</span> 530 <span class="c"># . WeightedTanimoto = beta * Tanimoto + (1 - beta) * Tanimoto'</span> 531 <span class="c">#</span> 532 <span class="c"># . WeightedTversky = beta * Tversky + (1 - beta) * Tversky'</span> 533 <span class="c">#</span> 534 <span class="c">#</span> 535 536 <span class="c"># Calculate BaroniUrbani similarity coefficient for two same size bit vectors.</span> 537 <span class="c">#</span> 538 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 539 <span class="c">#</span> <a name="BaroniUrbaniSimilarityCoefficient-"></a> 540 <span class="k">sub </span><span class="m">BaroniUrbaniSimilarityCoefficient ($$)</span> <span class="s">{</span> 541 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 542 543 <span class="k">return</span> <span class="i">BuserSimilarityCoefficient</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 544 <span class="s">}</span> 545 546 <span class="c"># Calculate Buser similarity coefficient for two same size bit vectors.</span> 547 <span class="c">#</span> 548 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 549 <span class="c">#</span> <a name="BuserSimilarityCoefficient-"></a> 550 <span class="k">sub </span><span class="m">BuserSimilarityCoefficient ($$)</span> <span class="s">{</span> 551 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 552 <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">$Nt</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> 553 554 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 555 <span class="i">$Nd</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 556 <span class="i">$Nt</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 557 558 <span class="i">$Numerator</span> = <span class="k">sqrt</span><span class="s">(</span><span class="i">$Nc</span>*<span class="i">$Nd</span><span class="s">)</span> + <span class="i">$Nc</span><span class="sc">;</span> 559 <span class="i">$Denominator</span> = <span class="k">sqrt</span><span class="s">(</span><span class="i">$Nc</span>*<span class="i">$Nd</span><span class="s">)</span> + <span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nc</span><span class="s">)</span> + <span class="s">(</span><span class="i">$Nb</span> - <span class="i">$Nc</span> <span class="s">)</span> + <span class="i">$Nc</span><span class="sc">;</span> 560 561 <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> 562 <span class="s">}</span> 563 564 <span class="c"># Calculate Cosine similarity coefficient for two same size bit vectors.</span> 565 <span class="c">#</span> 566 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 567 <span class="c">#</span> <a name="CosineSimilarityCoefficient-"></a> 568 <span class="k">sub </span><span class="m">CosineSimilarityCoefficient ($$)</span> <span class="s">{</span> 569 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 570 <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> 571 572 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 573 574 <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span> 575 <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> 576 577 <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> 578 <span class="s">}</span> 579 580 <span class="c"># Calculate Dice similarity coefficient for two same size bit vectors.</span> 581 <span class="c">#</span> 582 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 583 <span class="c">#</span> <a name="DiceSimilarityCoefficient-"></a> 584 <span class="k">sub </span><span class="m">DiceSimilarityCoefficient ($$)</span> <span class="s">{</span> 585 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 586 <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> 587 588 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 589 590 <span class="i">$Numerator</span> = <span class="n">2</span>*<span class="i">$Nc</span><span class="sc">;</span> 591 <span class="i">$Denominator</span> = <span class="i">$Na</span> + <span class="i">$Nb</span><span class="sc">;</span> 592 593 <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> 594 <span class="s">}</span> 595 596 <span class="c"># Calculate Dennis similarity coefficient for two same size bit vectors.</span> 597 <span class="c">#</span> 598 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 599 <span class="c">#</span> <a name="DennisSimilarityCoefficient-"></a> 600 <span class="k">sub </span><span class="m">DennisSimilarityCoefficient ($$)</span> <span class="s">{</span> 601 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 602 <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">$Nt</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> 603 604 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 605 <span class="i">$Nd</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 606 <span class="i">$Nt</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 607 608 <span class="i">$Numerator</span> = <span class="i">$Nc</span>*<span class="i">$Nd</span> - <span class="s">(</span><span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nc</span><span class="s">)</span>*<span class="s">(</span><span class="i">$Nb</span> - <span class="i">$Nc</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> 609 <span class="i">$Denominator</span> = <span class="k">sqrt</span><span class="s">(</span><span class="i">$Nt</span>*<span class="i">$Na</span>*<span class="i">$Nb</span><span class="s">)</span><span class="sc">;</span> 610 611 <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> 612 <span class="s">}</span> 613 614 <span class="c"># Calculate Forbes similarity coefficient for two same size bit vectors.</span> 615 <span class="c">#</span> 616 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 617 <span class="c">#</span> <a name="ForbesSimilarityCoefficient-"></a> 618 <span class="k">sub </span><span class="m">ForbesSimilarityCoefficient ($$)</span> <span class="s">{</span> 619 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 620 <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">$Nt</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> 621 622 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 623 <span class="i">$Nd</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 624 <span class="i">$Nt</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 625 626 <span class="i">$Numerator</span> = <span class="i">$Nt</span>*<span class="i">$Nc</span><span class="sc">;</span> 627 <span class="i">$Denominator</span> = <span class="i">$Na</span>*<span class="i">$Nb</span><span class="sc">;</span> 628 629 <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> 630 <span class="s">}</span> 631 632 <span class="c"># Calculate Fossum similarity coefficient for two same size bit vectors.</span> 633 <span class="c">#</span> 634 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 635 <span class="c">#</span> <a name="FossumSimilarityCoefficient-"></a> 636 <span class="k">sub </span><span class="m">FossumSimilarityCoefficient ($$)</span> <span class="s">{</span> 637 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 638 <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">$Nt</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> 639 640 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 641 <span class="i">$Nd</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 642 <span class="i">$Nt</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 643 644 <span class="i">$Numerator</span> = <span class="i">$Nt</span>*<span class="s">(</span><span class="s">(</span><span class="i">$Nc</span> - <span class="n">0.5</span><span class="s">)</span>** <span class="n">2</span><span class="s">)</span><span class="sc">;</span> 645 <span class="i">$Denominator</span> = <span class="i">$Na</span>*<span class="i">$Nb</span> <span class="sc">;</span> 646 647 <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> 648 <span class="s">}</span> 649 650 <span class="c"># Calculate Hamann similarity coefficient for two same size bit vectors.</span> 651 <span class="c">#</span> 652 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 653 <span class="c">#</span> <a name="HamannSimilarityCoefficient-"></a> 654 <span class="k">sub </span><span class="m">HamannSimilarityCoefficient ($$)</span> <span class="s">{</span> 655 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 656 <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">$Nt</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> 657 658 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 659 <span class="i">$Nd</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 660 <span class="i">$Nt</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 661 662 <span class="i">$Numerator</span> = <span class="s">(</span><span class="i">$Nc</span> + <span class="i">$Nd</span> <span class="s">)</span> - <span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nc</span><span class="s">)</span> - <span class="s">(</span><span class="i">$Nb</span> - <span class="i">$Nc</span><span class="s">)</span> <span class="sc">;</span> 663 <span class="i">$Denominator</span> = <span class="i">$Nt</span><span class="sc">;</span> 664 665 <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> 666 <span class="s">}</span> 667 668 <span class="c"># Calculate Jacard similarity coefficient for two same size bit vectors.</span> 669 <span class="c">#</span> 670 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 671 <span class="c">#</span> <a name="JacardSimilarityCoefficient-"></a> 672 <span class="k">sub </span><span class="m">JacardSimilarityCoefficient ($$)</span> <span class="s">{</span> 673 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 674 675 <span class="k">return</span> <span class="i">TanimotoSimilarityCoefficient</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 676 <span class="s">}</span> 677 678 <span class="c"># Calculate Kulczynski1 similarity coefficient for two same size bit vectors.</span> 679 <span class="c">#</span> 680 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 681 <span class="c">#</span> <a name="Kulczynski1SimilarityCoefficient-"></a> 682 <span class="k">sub </span><span class="m">Kulczynski1SimilarityCoefficient ($$)</span> <span class="s">{</span> 683 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 684 <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> 685 686 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 687 688 <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span> 689 <span class="i">$Denominator</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> 690 691 <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> 692 <span class="s">}</span> 693 694 <span class="c"># Calculate Kulczynski2 similarity coefficient for two same size bit vectors.</span> 695 <span class="c">#</span> 696 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 697 <span class="c">#</span> <a name="Kulczynski2SimilarityCoefficient-"></a> 698 <span class="k">sub </span><span class="m">Kulczynski2SimilarityCoefficient ($$)</span> <span class="s">{</span> 699 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 700 <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> 701 702 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 703 704 <span class="i">$Numerator</span> = <span class="n">0.5</span>*<span class="s">(</span><span class="i">$Na</span>*<span class="i">$Nc</span> + <span class="i">$Nb</span>*<span class="i">$Nc</span><span class="s">)</span><span class="sc">;</span> 705 <span class="i">$Denominator</span> = <span class="i">$Na</span>*<span class="i">$Nb</span><span class="sc">;</span> 706 707 <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> 708 <span class="s">}</span> 709 710 <span class="c"># Calculate Matching similarity coefficient for two same size bit vectors.</span> 711 <span class="c">#</span> 712 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 713 <span class="c">#</span> <a name="MatchingSimilarityCoefficient-"></a> 714 <span class="k">sub </span><span class="m">MatchingSimilarityCoefficient ($$)</span> <span class="s">{</span> 715 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 716 <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">$Nt</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> 717 718 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 719 <span class="i">$Nd</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 720 <span class="i">$Nt</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 721 722 <span class="i">$Numerator</span> = <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 723 <span class="i">$Denominator</span> = <span class="i">$Nt</span><span class="sc">;</span> 724 725 <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> 726 <span class="s">}</span> 727 728 <span class="c"># Calculate McConnaughey similarity coefficient for two same size bit vectors.</span> 729 <span class="c">#</span> 730 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 731 <span class="c">#</span> <a name="McConnaugheySimilarityCoefficient-"></a> 732 <span class="k">sub </span><span class="m">McConnaugheySimilarityCoefficient ($$)</span> <span class="s">{</span> 733 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 734 <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> 735 736 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 737 738 <span class="i">$Numerator</span> = <span class="i">$Nc</span>**<span class="n">2</span> - <span class="s">(</span><span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nc</span><span class="s">)</span>*<span class="s">(</span><span class="i">$Nb</span> - <span class="i">$Nc</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> 739 <span class="i">$Denominator</span> = <span class="i">$Na</span>*<span class="i">$Nb</span> <span class="sc">;</span> 740 741 <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> 742 <span class="s">}</span> 743 744 <span class="c"># Calculate Ochiai similarity coefficient for two same size bit vectors.</span> 745 <span class="c">#</span> 746 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 747 <span class="c">#</span> <a name="OchiaiSimilarityCoefficient-"></a> 748 <span class="k">sub </span><span class="m">OchiaiSimilarityCoefficient ($$)</span> <span class="s">{</span> 749 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 750 751 <span class="k">return</span> <span class="i">CosineSimilarityCoefficient</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 752 <span class="s">}</span> 753 754 <span class="c"># Calculate Pearson similarity coefficient for two same size bit vectors.</span> 755 <span class="c">#</span> 756 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 757 <span class="c">#</span> <a name="PearsonSimilarityCoefficient-"></a> 758 <span class="k">sub </span><span class="m">PearsonSimilarityCoefficient ($$)</span> <span class="s">{</span> 759 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 760 <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">$Nt</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> 761 762 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 763 <span class="i">$Nd</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 764 <span class="i">$Nt</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 765 766 <span class="i">$Numerator</span> = <span class="s">(</span><span class="i">$Nc</span>*<span class="i">$Nd</span> <span class="s">)</span> - <span class="s">(</span><span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nc</span><span class="s">)</span>*<span class="s">(</span><span class="i">$Nb</span> - <span class="i">$Nc</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> 767 <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="i">$Na</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span> <span class="s">)</span>*<span class="s">(</span><span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> 768 769 <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> 770 <span class="s">}</span> 771 772 <span class="c"># Calculate RogersTanimoto similarity coefficient for two same size bit vectors.</span> 773 <span class="c">#</span> 774 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 775 <span class="c">#</span> <a name="RogersTanimotoSimilarityCoefficient-"></a> 776 <span class="k">sub </span><span class="m">RogersTanimotoSimilarityCoefficient ($$)</span> <span class="s">{</span> 777 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 778 <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">$Nt</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> 779 780 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 781 <span class="i">$Nd</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 782 <span class="i">$Nt</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 783 784 <span class="i">$Numerator</span> = <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 785 <span class="i">$Denominator</span> = <span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nc</span><span class="s">)</span> + <span class="s">(</span><span class="i">$Nb</span> - <span class="i">$Nc</span><span class="s">)</span> + <span class="i">$Nt</span><span class="sc">;</span> 786 787 <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> 788 <span class="s">}</span> 789 790 <span class="c"># Calculate RussellRao similarity coefficient for two same size bit vectors.</span> 791 <span class="c">#</span> 792 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 793 <span class="c">#</span> <a name="RussellRaoSimilarityCoefficient-"></a> 794 <span class="k">sub </span><span class="m">RussellRaoSimilarityCoefficient ($$)</span> <span class="s">{</span> 795 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 796 <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">$Nt</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> 797 798 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 799 <span class="i">$Nd</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 800 <span class="i">$Nt</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 801 802 <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span> 803 <span class="i">$Denominator</span> = <span class="i">$Nt</span><span class="sc">;</span> 804 805 <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> 806 <span class="s">}</span> 807 808 <span class="c"># Calculate Simpson similarity coefficient for two same size bit vectors.</span> 809 <span class="c">#</span> 810 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 811 <span class="c">#</span> <a name="SimpsonSimilarityCoefficient-"></a> 812 <span class="k">sub </span><span class="m">SimpsonSimilarityCoefficient ($$)</span> <span class="s">{</span> 813 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 814 <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> 815 816 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 817 818 <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span> 819 <span class="i">$Denominator</span> = <span class="i">min</span><span class="s">(</span><span class="i">$Na</span><span class="cm">,</span> <span class="i">$Nb</span><span class="s">)</span><span class="sc">;</span> 820 821 <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> 822 <span class="s">}</span> 823 824 <span class="c"># Calculate SkoalSneath1 similarity coefficient for two same size bit vectors.</span> 825 <span class="c">#</span> 826 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 827 <span class="c">#</span> <a name="SkoalSneath1SimilarityCoefficient-"></a> 828 <span class="k">sub </span><span class="m">SkoalSneath1SimilarityCoefficient ($$)</span> <span class="s">{</span> 829 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 830 <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> 831 832 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 833 834 <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span> 835 <span class="i">$Denominator</span> = <span class="i">$Nc</span> + <span class="n">2</span>*<span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nc</span><span class="s">)</span> + <span class="n">2</span>*<span class="s">(</span><span class="i">$Nb</span> - <span class="i">$Nc</span><span class="s">)</span><span class="sc">;</span> 836 837 <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> 838 <span class="s">}</span> 839 840 <span class="c"># Calculate SkoalSneath2 similarity coefficient for two same size bit vectors.</span> 841 <span class="c">#</span> 842 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 843 <span class="c">#</span> <a name="SkoalSneath2SimilarityCoefficient-"></a> 844 <span class="k">sub </span><span class="m">SkoalSneath2SimilarityCoefficient ($$)</span> <span class="s">{</span> 845 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 846 <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">$Nt</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> 847 848 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 849 <span class="i">$Nd</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 850 <span class="i">$Nt</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 851 852 <span class="i">$Numerator</span> = <span class="n">2</span>*<span class="i">$Nc</span> + <span class="n">2</span>*<span class="i">$Nd</span> <span class="sc">;</span> 853 <span class="i">$Denominator</span> = <span class="i">$Nc</span> + <span class="i">$Nd</span> + <span class="i">$Nt</span> <span class="sc">;</span> 854 855 <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> 856 <span class="s">}</span> 857 858 <span class="c"># Calculate SkoalSneath3 similarity coefficient for two same size bit vectors.</span> 859 <span class="c">#</span> 860 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 861 <span class="c">#</span> <a name="SkoalSneath3SimilarityCoefficient-"></a> 862 <span class="k">sub </span><span class="m">SkoalSneath3SimilarityCoefficient ($$)</span> <span class="s">{</span> 863 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 864 <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">$Nt</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> 865 866 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 867 <span class="i">$Nd</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 868 <span class="i">$Nt</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 869 870 <span class="i">$Numerator</span> = <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 871 <span class="i">$Denominator</span> = <span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nc</span><span class="s">)</span> + <span class="s">(</span><span class="i">$Nb</span> - <span class="i">$Nc</span> <span class="s">)</span> <span class="sc">;</span> 872 873 <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> 874 <span class="s">}</span> 875 876 <span class="c"># Calculate Tanimoto similarity coefficient for two same size bit vectors.</span> 877 <span class="c">#</span> 878 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 879 <span class="c">#</span> <a name="TanimotoSimilarityCoefficient-"></a> 880 <span class="k">sub </span><span class="m">TanimotoSimilarityCoefficient ($$)</span> <span class="s">{</span> 881 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 882 <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> 883 884 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 885 886 <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span> 887 <span class="i">$Denominator</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span><span class="sc">;</span> 888 889 <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> 890 <span class="s">}</span> 891 892 <span class="c"># Calculate Tversky similarity coefficient for two same size bit vectors.</span> 893 <span class="c">#</span> 894 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 895 <span class="c">#</span> <a name="TverskySimilarityCoefficient-"></a> 896 <span class="k">sub </span><span class="m">TverskySimilarityCoefficient ($$$)</span> <span class="s">{</span> 897 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="cm">,</span> <span class="i">$Alpha</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 898 <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> 899 900 <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Alpha</span><span class="s">)</span> && <span class="s">(</span><span class="i">$Alpha</span> >= <span class="n">0</span> && <span class="i">$Alpha</span> <= <span class="n">1</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 901 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->TverskySimilarityCoefficient: Alpha parameters must be defined and its value must be >=0 and <=1 ..."</span><span class="sc">;</span> 902 <span class="s">}</span> 903 904 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 905 906 <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span> 907 <span class="i">$Denominator</span> = <span class="i">$Alpha</span>*<span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nb</span> <span class="s">)</span> + <span class="i">$Nb</span><span class="sc">;</span> 908 909 <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> 910 <span class="s">}</span> 911 912 <span class="c"># Calculate Yule similarity coefficient for two same size bit vectors.</span> 913 <span class="c">#</span> 914 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 915 <span class="c">#</span> <a name="YuleSimilarityCoefficient-"></a> 916 <span class="k">sub </span><span class="m">YuleSimilarityCoefficient ($$)</span> <span class="s">{</span> 917 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 918 <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">$Nt</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> 919 920 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 921 <span class="i">$Nd</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 922 <span class="i">$Nt</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span> + <span class="i">$Nd</span><span class="sc">;</span> 923 924 <span class="i">$Numerator</span> = <span class="s">(</span><span class="i">$Nc</span>*<span class="i">$Nd</span><span class="s">)</span> - <span class="s">(</span><span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nc</span><span class="s">)</span>*<span class="s">(</span><span class="i">$Nb</span> - <span class="i">$Nc</span><span class="s">)</span><span class="s">)</span> <span class="sc">;</span> 925 <span class="i">$Denominator</span> = <span class="s">(</span><span class="i">$Nc</span>*<span class="i">$Nd</span><span class="s">)</span> + <span class="s">(</span><span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nc</span><span class="s">)</span>*<span class="s">(</span><span class="i">$Nb</span> - <span class="i">$Nc</span><span class="s">)</span><span class="s">)</span> <span class="sc">;</span> 926 927 <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> 928 <span class="s">}</span> 929 930 <span class="c"># Calculate WeightedTanimoto similarity coefficient for two same size bit vectors.</span> 931 <span class="c">#</span> 932 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 933 <span class="c">#</span> <a name="WeightedTanimotoSimilarityCoefficient-"></a> 934 <span class="k">sub </span><span class="m">WeightedTanimotoSimilarityCoefficient ($$$)</span> <span class="s">{</span> 935 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="cm">,</span> <span class="i">$Beta</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 936 <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">$TanimotoForSetBits</span><span class="cm">,</span> <span class="i">$TanimotoForClearBits</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="cm">,</span> <span class="i">$WeightedTanimoto</span><span class="s">)</span><span class="sc">;</span> 937 938 <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Beta</span><span class="s">)</span> && <span class="s">(</span><span class="i">$Beta</span> >= <span class="n">0</span> && <span class="i">$Beta</span> <= <span class="n">1</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 939 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->WeightedTanimotoSimilarityCoefficient: Beta parameters must be defined and its value must be >=0 and <=1 ..."</span><span class="sc">;</span> 940 <span class="s">}</span> 941 942 <span class="c"># Get Tanimoto for set bits...</span> 943 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 944 945 <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span> 946 <span class="i">$Denominator</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span><span class="sc">;</span> 947 <span class="i">$TanimotoForSetBits</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> 948 949 <span class="c"># Get Tanimoto for clear bits...</span> 950 <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">_GetNumOfIndividualAndCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 951 952 <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span> 953 <span class="i">$Denominator</span> = <span class="i">$Na</span> + <span class="i">$Nb</span> - <span class="i">$Nc</span><span class="sc">;</span> 954 <span class="i">$TanimotoForClearBits</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> 955 956 <span class="i">$WeightedTanimoto</span> = <span class="i">$Beta</span>*<span class="i">$TanimotoForSetBits</span> + <span class="s">(</span><span class="n">1</span> - <span class="i">$Beta</span><span class="s">)</span>*<span class="i">$TanimotoForClearBits</span><span class="sc">;</span> 957 958 <span class="k">return</span> <span class="i">$WeightedTanimoto</span><span class="sc">;</span> 959 <span class="s">}</span> 960 961 <span class="c"># Calculate WeightedTversky similarity coefficient for two same size bit vectors.</span> 962 <span class="c">#</span> 963 <span class="c"># This functionality can be either invoked as a class function or an object method.</span> 964 <span class="c">#</span> <a name="WeightedTverskySimilarityCoefficient-"></a> 965 <span class="k">sub </span><span class="m">WeightedTverskySimilarityCoefficient ($$$)</span> <span class="s">{</span> 966 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="cm">,</span> <span class="i">$Alpha</span><span class="cm">,</span> <span class="i">$Beta</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 967 <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">$TverskyForSetBits</span><span class="cm">,</span> <span class="i">$TverskyForClearBits</span><span class="cm">,</span> <span class="i">$Numerator</span><span class="cm">,</span> <span class="i">$Denominator</span><span class="cm">,</span> <span class="i">$WeightedTversky</span><span class="s">)</span><span class="sc">;</span> 968 969 <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Alpha</span><span class="s">)</span> && <span class="s">(</span><span class="i">$Alpha</span> >= <span class="n">0</span> && <span class="i">$Alpha</span> <= <span class="n">1</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 970 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->WeightedTverskySimilarityCoefficient: Alpha parameters must be defined and its value must be >=0 and <=1 ..."</span><span class="sc">;</span> 971 <span class="s">}</span> 972 <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Beta</span><span class="s">)</span> && <span class="s">(</span><span class="i">$Beta</span> >= <span class="n">0</span> && <span class="i">$Beta</span> <= <span class="n">1</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 973 <span class="w">croak</span> <span class="q">"Error: ${ClassName}->WeightedTverskySimilarityCoefficient: Beta parameters must be defined and its value must be >=0 and <=1 ..."</span><span class="sc">;</span> 974 <span class="s">}</span> 975 976 <span class="c"># Get Tversky for set bits...</span> 977 <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">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 978 979 <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span> 980 <span class="i">$Denominator</span> = <span class="i">$Alpha</span>*<span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nb</span> <span class="s">)</span> + <span class="i">$Nb</span><span class="sc">;</span> 981 <span class="i">$TverskyForSetBits</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> 982 983 <span class="c"># Get Tversky for clear bits...</span> 984 <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">_GetNumOfIndividualAndCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 985 986 <span class="i">$Numerator</span> = <span class="i">$Nc</span><span class="sc">;</span> 987 <span class="i">$Denominator</span> = <span class="i">$Alpha</span>*<span class="s">(</span><span class="i">$Na</span> - <span class="i">$Nb</span> <span class="s">)</span> + <span class="i">$Nb</span><span class="sc">;</span> 988 <span class="i">$TverskyForClearBits</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> 989 990 <span class="i">$WeightedTversky</span> = <span class="i">$Beta</span>*<span class="i">$TverskyForSetBits</span> + <span class="s">(</span><span class="n">1</span> - <span class="i">$Beta</span><span class="s">)</span>*<span class="i">$TverskyForClearBits</span><span class="sc">;</span> 991 992 <span class="k">return</span> <span class="i">$WeightedTversky</span><span class="sc">;</span> 993 <span class="s">}</span> 994 995 <span class="c"># Get number of Na, Nb and Nc bits in bit vector A and B to be used for similarity coefficient calculations...</span> 996 <span class="c">#</span> <a name="_GetNumOfIndividualAndCommonSetBits-"></a> 997 <span class="k">sub </span><span class="m">_GetNumOfIndividualAndCommonSetBits ($$)</span> <span class="s">{</span> 998 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 999 <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="s">)</span><span class="sc">;</span> 1000 1001 <span class="c"># Number of bits set to "1" in A</span> 1002 <span class="i">$Na</span> = <span class="i">$FingerprintsBitVectorA</span><span class="i">->GetNumOfSetBits</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 1003 1004 <span class="c"># Number of bits set to "1" in B</span> 1005 <span class="i">$Nb</span> = <span class="i">$FingerprintsBitVectorB</span><span class="i">->GetNumOfSetBits</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 1006 1007 <span class="c"># Number of bits set to "1" in both A and B</span> 1008 <span class="k">my</span><span class="s">(</span><span class="i">$NcBitVector</span><span class="s">)</span><span class="sc">;</span> 1009 <span class="i">$NcBitVector</span> = <span class="i">$FingerprintsBitVectorA</span> & <span class="i">$FingerprintsBitVectorB</span><span class="sc">;</span> 1010 <span class="i">$Nc</span> = <span class="i">$NcBitVector</span><span class="i">->GetNumOfSetBits</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 1011 1012 <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> 1013 <span class="s">}</span> 1014 1015 <span class="c"># Get number of Nd bits in bit vector A and B to be used for similarity coefficient calculations...</span> 1016 <span class="c">#</span> <a name="_GetNumOfCommonClearBits-"></a>1017 <span class="k">sub </span><span class="m">_GetNumOfCommonClearBits ($$)</span> <span class="s">{</span> 1018 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 1019 <span class="k">my</span><span class="s">(</span><span class="i">$Nd</span><span class="cm">,</span> <span class="i">$NdBitVector</span><span class="s">)</span><span class="sc">;</span> 1020 1021 <span class="c"># Number of bits set to "0" in both A and B</span> 1022 <span class="i">$NdBitVector</span> = ~<span class="i">$FingerprintsBitVectorA</span> & ~<span class="i">$FingerprintsBitVectorB</span><span class="sc">;</span> 1023 <span class="i">$Nd</span> = <span class="i">$NdBitVector</span><span class="i">->GetNumOfSetBits</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 1024 1025 <span class="c"># Correct for number of clear bits used for padding...</span> 1026 <span class="k">if</span> <span class="s">(</span><span class="i">_IsNumOfClearBitsCorrectionRequired</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 1027 <span class="i">$Nd</span> = <span class="i">$Nd</span> - <span class="i">_GetNumOfClearBitsCorrection</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="s">)</span><span class="sc">;</span> 1028 <span class="s">}</span> 1029 <span class="k">elsif</span> <span class="s">(</span><span class="i">_IsNumOfClearBitsCorrectionRequired</span><span class="s">(</span><span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 1030 <span class="i">$Nd</span> = <span class="i">$Nd</span> - <span class="i">_GetNumOfClearBitsCorrection</span><span class="s">(</span><span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 1031 <span class="s">}</span> 1032 1033 <span class="k">return</span> <span class="i">$Nd</span><span class="sc">;</span> 1034 <span class="s">}</span> 1035 1036 <span class="c"># Get number of Na, Nb and Nc bits in bit vector A and B to be used for similarity coefficient calculations...</span> 1037 <span class="c">#</span> <a name="_GetNumOfIndividualAndCommonClearBits-"></a>1038 <span class="k">sub </span><span class="m">_GetNumOfIndividualAndCommonClearBits ($$)</span> <span class="s">{</span> 1039 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 1040 <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="s">)</span><span class="sc">;</span> 1041 1042 <span class="c"># Number of bits set to "0" in A</span> 1043 <span class="i">$Na</span> = <span class="i">$FingerprintsBitVectorA</span><span class="i">->GetNumOfClearBits</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 1044 1045 <span class="c"># Correct for number of clear bits used for padding...</span> 1046 <span class="k">if</span> <span class="s">(</span><span class="i">_IsNumOfClearBitsCorrectionRequired</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 1047 <span class="i">$Na</span> = <span class="i">$Na</span> - <span class="i">_GetNumOfClearBitsCorrection</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="s">)</span><span class="sc">;</span> 1048 <span class="s">}</span> 1049 1050 <span class="c"># Number of bits set to "0" in B</span> 1051 <span class="i">$Nb</span> = <span class="i">$FingerprintsBitVectorB</span><span class="i">->GetNumOfClearBits</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> 1052 1053 <span class="c"># Correct for number of clear bits used for padding...</span> 1054 <span class="k">if</span> <span class="s">(</span><span class="i">_IsNumOfClearBitsCorrectionRequired</span><span class="s">(</span><span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> 1055 <span class="i">$Nb</span> = <span class="i">$Nb</span> - <span class="i">_GetNumOfClearBitsCorrection</span><span class="s">(</span><span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 1056 <span class="s">}</span> 1057 1058 <span class="c"># Number of bits set to "0" in both A and B</span> 1059 <span class="i">$Nc</span> = <span class="i">_GetNumOfCommonClearBits</span><span class="s">(</span><span class="i">$FingerprintsBitVectorA</span><span class="cm">,</span> <span class="i">$FingerprintsBitVectorB</span><span class="s">)</span><span class="sc">;</span> 1060 1061 <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> 1062 <span class="s">}</span> 1063 1064 <span class="c"># Irrespective of specified size, Perl functions used to handle bit data data in</span> 1065 <span class="c"># BitVector class automatically sets the size to the next nearest power of 2</span> 1066 <span class="c"># and clear the extra bits.</span> 1067 <span class="c">#</span> 1068 <span class="c"># SpecifiedSize is used by this class to process any aribitray size during similarity</span> 1069 <span class="c"># coefficient calculations.</span> 1070 <span class="c">#</span> 1071 <span class="c"># Assuming the FingerprintsBitBector class only manipulates bits upto specified</span> 1072 <span class="c"># size, a correction for the extra bits added by BitVector class needs to be applied</span> 1073 <span class="c"># to number of clear bits.</span> 1074 <span class="c">#</span> <a name="_GetNumOfClearBitsCorrection-"></a>1075 <span class="k">sub </span><span class="m">_GetNumOfClearBitsCorrection</span> <span class="s">{</span> 1076 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVector</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 1077 1078 <span class="k">return</span> <span class="s">(</span><span class="i">$FingerprintsBitVector</span>->{<span class="w">Size</span>} - <span class="i">$FingerprintsBitVector</span>->{<span class="w">SpecifiedSize</span>}<span class="s">)</span><span class="sc">;</span> 1079 <span class="s">}</span> 1080 1081 <span class="c"># Is number of clear bits correction required?</span> 1082 <span class="c">#</span> <a name="_IsNumOfClearBitsCorrectionRequired-"></a>1083 <span class="k">sub </span><span class="m">_IsNumOfClearBitsCorrectionRequired</span> <span class="s">{</span> 1084 <span class="k">my</span><span class="s">(</span><span class="i">$FingerprintsBitVector</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> 1085 1086 <span class="k">return</span> <span class="s">(</span><span class="i">$FingerprintsBitVector</span>->{<span class="w">Size</span>} > <span class="i">$FingerprintsBitVector</span>->{<span class="w">SpecifiedSize</span>}<span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> 1087 <span class="s">}</span> 1088 1089 <a name="EOF-"></a></pre> <p> </p> <br /> <center> <img src="../../../images/h2o2.png"> </center> </body> </html>