diff --git a/Code/DataStructs/SparseIntVect.h b/Code/DataStructs/SparseIntVect.h index 0e6e20578..c519d503d 100644 --- a/Code/DataStructs/SparseIntVect.h +++ b/Code/DataStructs/SparseIntVect.h @@ -337,6 +337,9 @@ namespace RDKit{ double DiceSimilarity(const SparseIntVect &v1, const SparseIntVect &v2, double bounds=0.0){ + if(v1.getLength()!=v2.getLength()){ + throw ValueErrorException("SparseIntVect size mismatch"); + } double v1Sum=v1.getTotalVal(); double v2Sum=v2.getTotalVal(); double denom=v1Sum+v2Sum; @@ -349,7 +352,31 @@ namespace RDKit{ return 0.0; } } - double numer=(v1&v2).getTotalVal(); + + double numer=0.0; + // we're doing : (v1&v2).getTotalVal(), but w/o generating + // the other vector: + typename SparseIntVect::StorageType::const_iterator iter1,iter2; + iter1=v1.getNonzeroElements().begin(); + iter2=v2.getNonzeroElements().begin(); + while(iter1 != v1.getNonzeroElements().end()){ + while(iter2!=v2.getNonzeroElements().end() && iter2->first < iter1->first){ + ++iter2; + } + if(iter2!=v2.getNonzeroElements().end()){ + if(iter2->first == iter1->first){ + if(iter2->secondsecond){ + numer += iter2->second; + } else { + numer += iter1->second; + } + ++iter2; + } + ++iter1; + } else { + break; + } + } return 2.*numer/denom; } } diff --git a/Code/DataStructs/Wrap/testDiscreteValueVect.py b/Code/DataStructs/Wrap/testDiscreteValueVect.py index f5b0d9968..e151e072a 100644 --- a/Code/DataStructs/Wrap/testDiscreteValueVect.py +++ b/Code/DataStructs/Wrap/testDiscreteValueVect.py @@ -1,3 +1,9 @@ +# $Id$ +# +# Copyright (C) 2007,2008 Greg Landrum +# +# @@ All Rights Reserved @@ +# import RDConfig import os,sys,cPickle import unittest diff --git a/Code/DataStructs/Wrap/testSparseIntVect.py b/Code/DataStructs/Wrap/testSparseIntVect.py index fc8f2537b..bbbf75d9a 100644 --- a/Code/DataStructs/Wrap/testSparseIntVect.py +++ b/Code/DataStructs/Wrap/testSparseIntVect.py @@ -1,8 +1,16 @@ +# $Id$ +# +# Copyright (C) 2007,2008 Greg Landrum +# +# @@ All Rights Reserved @@ +# import RDConfig import os,sys,cPickle import unittest import DataStructs as ds +def feq(v1,v2,tol=1e-4): + return abs(v1-v2)(bvs.attr("__len__")()); for(unsigned int i=0;i(bvs[i])(); + const T &bv2=python::extract(bvs[i])(); if(bv1.GetNumBits()>bv2.GetNumBits()){ T *bv1tmp = FoldFingerprint(bv1,bv1.GetNumBits()/bv2.GetNumBits()); simVal = metric(*bv1tmp,bv2);