// $Id$ // // Copyright (C) 2001-2014 Greg Landrum and Rational Discovery LLC // // @@ All Rights Reserved @@ // This file is part of the RDKit. // The contents are covered by the terms of the BSD license // which is included in the file license.txt, found at the root // of the RDKit source tree. // #include #include #include #include #include #include "BitVects.h" #include "BitOps.h" #include "BitVectUtils.h" #include "base64.h" #include #include "DiscreteValueVect.h" #include #include #include #include #include using namespace std; using namespace RDKit; template< typename T > inline void TXTMSG(const char *__a__,T __b__){ BOOST_LOG(rdInfoLog) << (__a__) << " " << (__b__) << std::endl; } bool feq(double v1,double v2,double tol=1e-4){ return fabs(v1-v2)<1e-4; } template void Test(T arg){ T t1(20); TXTMSG("Set 10:",t1.setBit(10)); TXTMSG("Set 11:",t1.setBit(11)); TXTMSG("Set 14:",t1.setBit(14)); TXTMSG("Set 10:",t1.setBit(10)); TXTMSG("Get 14:",t1.getBit(14)); TXTMSG("Num:",t1.getNumBits()); TXTMSG("NumOn:",t1.getNumOnBits()); TXTMSG("NumOff:",t1.getNumOffBits()); TEST_ASSERT(t1==t1); IntVect onBits; t1.getOnBits(onBits); std::copy(onBits.begin(),onBits.end(),std::ostream_iterator(std::cout,", ")); std::cout << std::endl; T t2(t1); //onBits = t2.getOnBits(); TXTMSG("t2[19]:",t2[19]); TXTMSG("t2[14]:",t2[14]); TEST_ASSERT(t2==t1); t2 = t1; //onBits = t2.getOnBits(); TXTMSG("t2[19]:",t2[19]); t2.unsetBit(14); TXTMSG("t2[14]:",t2[14]); t2.setBit(15); t2.setBit(17); TEST_ASSERT(t2!=t1); std::cout << "t1: "; t1.getOnBits(onBits); std::copy(onBits.begin(),onBits.end(),std::ostream_iterator(std::cout,", ")); std::cout << std::endl; std::cout << "t2: "; t2.getOnBits(onBits); std::copy(onBits.begin(),onBits.end(),std::ostream_iterator(std::cout,", ")); std::cout << std::endl; std::cout << "t1|t2: "; T t3=t1|t2; t3.getOnBits(onBits); std::copy(onBits.begin(),onBits.end(),std::ostream_iterator(std::cout,", ")); std::cout << std::endl; std::cout << "t1&t2: "; t3=t1 & t2; t3.getOnBits(onBits); std::copy(onBits.begin(),onBits.end(),std::ostream_iterator(std::cout,", ")); std::cout << std::endl; std::cout << "t1^t2: "; t3=t1 ^ t2; t3.getOnBits(onBits); std::copy(onBits.begin(),onBits.end(),std::ostream_iterator(std::cout,", ")); std::cout << std::endl; std::cout << "~t1: "; t3= ~t1; t3.getOnBits(onBits); std::copy(onBits.begin(),onBits.end(),std::ostream_iterator(std::cout,", ")); std::cout << std::endl; try{ t3.getBit(4000); } catch (IndexErrorException) { std::cout << " except " << endl; } catch (...) { std::cout << " ERROR EXCEPT " << endl; } T t4(t1.toString()); TEST_ASSERT(t4==t1); TEST_ASSERT(feq(TanimotoSimilarity(t1,t4),1.0)); T *t5 = FoldFingerprint(t1); TEST_ASSERT(t5->getNumBits() == t1.getNumBits()/2); TEST_ASSERT(t5->getBit(0)); TEST_ASSERT(t5->getBit(1)); TEST_ASSERT(t5->getBit(4)); TEST_ASSERT(!t5->getBit(2)); TEST_ASSERT(!t5->getBit(3)); delete t5; std::string pkl=t1.toString(); const char *pkl64=Base64Encode(pkl.c_str(),pkl.size()); T t6(t1.getNumBits()); t6.initFromText(pkl64,strlen(pkl64),true); delete [] pkl64; TEST_ASSERT(t6==t1); } template void TaniTest(T &arg){ std::string fps[4] = { ".b+HHa.EgU6+ibEIr89.CpX0g8FZiXH+R0+Ps.mr6tg.2", ".b7HEa..ccc+gWEIr89.8lV8gOF3aXFFR.+Ps.mZ6lg.2", ".H+nHq2EcY09y5EIr9e.8p50h0NgiWGNx4+Hm+Gbslw.2", ".1.HHa..cUI6i5E2rO8.Op10d0NoiWGVx.+Hm.Gb6lo.2", }; double dists[] = { 1.0,0.788991,0.677165,0.686957, 1.0,0.578125,0.591304, 1.0,0.732759, 1.0 }; int idx=0; for(int i=0;i<4;i++){ T v1(256); FromDaylightString(v1,fps[i]); for(int j=i;j<4;j++){ T v2(256); FromDaylightString(v2,fps[j]); double tani=TanimotoSimilarity(v1,v2); TEST_ASSERT(feq(tani,dists[idx])); tani = TverskySimilarity(v1,v2,1.,1.); TEST_ASSERT(feq(tani,dists[idx])); tani = SimilarityWrapper(v1,v2,TanimotoSimilarity); TEST_ASSERT(feq(tani,dists[idx])); tani = SimilarityWrapper(v1,v2,1.,1.,TverskySimilarity); TEST_ASSERT(feq(tani,dists[idx])); tani = SimilarityWrapper(v1,v2,TanimotoSimilarity,true); TEST_ASSERT(feq(tani,1.-dists[idx])); tani = SimilarityWrapper(v1,v2,1.,1.,TverskySimilarity,true); TEST_ASSERT(feq(tani,1.-dists[idx])); idx++; } } } template void ProbeTest(T &arg){ int sz=1000; T t1(sz),t2(sz); for(int i=0;i iVect(255); TEST_ASSERT(iVect.getLength() == 255); TEST_ASSERT(iVect.getVal(23) ==0); iVect.setVal(23,14); TEST_ASSERT(iVect.getVal(23) ==14); SparseIntVect oVect(iVect); TEST_ASSERT(oVect.getLength() == 255); TEST_ASSERT(oVect.getVal(23) ==14); std::vector tmpV(3); tmpV[0]=1; tmpV[1]=5; tmpV[2]=1; TEST_ASSERT(iVect.getVal(1) ==0); TEST_ASSERT(iVect[1] ==0); TEST_ASSERT(iVect.getVal(5) ==0); TEST_ASSERT(iVect[5] ==0); updateFromSequence(iVect,tmpV); TEST_ASSERT(iVect.getVal(1) ==2); TEST_ASSERT(iVect[1] ==2); TEST_ASSERT(iVect.getVal(5) ==1); TEST_ASSERT(iVect[5] ==1); iVect.setVal(3,-4); TEST_ASSERT(iVect.getTotalVal()==13); try { iVect.setVal(-1,13); TEST_ASSERT(0); } catch (IndexErrorException &dexp) { ; } try { iVect.setVal(255,42); TEST_ASSERT(0); } catch (IndexErrorException &dexp) { ; } try { iVect.getVal(-1); TEST_ASSERT(0); } catch (IndexErrorException &dexp) { ; } try { iVect.getVal(255); TEST_ASSERT(0); } catch (IndexErrorException &dexp) { ; } try { iVect[-1]; TEST_ASSERT(0); } catch (IndexErrorException &dexp) { ; } { SparseIntVect iV1(5); iV1.setVal(4,4); iV1.setVal(0,2); iV1.setVal(3,1); SparseIntVect::StorageType::const_iterator iter=iV1.getNonzeroElements().begin(); TEST_ASSERT(iter->first==0); TEST_ASSERT(iter->second==2); ++iter; TEST_ASSERT(iter->first==3); TEST_ASSERT(iter->second==1); ++iter; TEST_ASSERT(iter->first==4); TEST_ASSERT(iter->second==4); ++iter; TEST_ASSERT(iter==iV1.getNonzeroElements().end()); TEST_ASSERT(feq(DiceSimilarity(iV1,iV1),1.)); } { // iV1 &= iV2 SparseIntVect iV1(5),iV2(5); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); iV1.setVal(4,4); iV2.setVal(1,2); iV2.setVal(2,3); iV2.setVal(3,4); iV2.setVal(4,6); TEST_ASSERT(feq(DiceSimilarity(iV1,iV2),18./26.)); iV1 &= iV2; TEST_ASSERT(iV1[0]==0); TEST_ASSERT(iV1[1]==0); TEST_ASSERT(iV1[2]==1); TEST_ASSERT(iV1[3]==4); TEST_ASSERT(iV1[4]==4); TEST_ASSERT(iV2[0]==0); TEST_ASSERT(iV2[1]==2); TEST_ASSERT(iV2[2]==3); TEST_ASSERT(iV2[3]==4); TEST_ASSERT(iV2[4]==6); TEST_ASSERT(feq(DiceSimilarity(iV1,iV2),18./24.)); TEST_ASSERT(feq(TverskySimilarity(iV1,iV2,0.5,0.5,false),9./12.)); TEST_ASSERT(feq(TverskySimilarity(iV1,iV2,1.0,1.0,false),9./15.)); TEST_ASSERT(feq(TanimotoSimilarity(iV1,iV2),9./15.)); TEST_ASSERT(feq(TverskySimilarity(iV1,iV2,0.333333333,0.66666666667,false),9./13.)); TEST_ASSERT(feq(TverskySimilarity(iV1,iV2,1.0,0.0,false),9./9.)); try { iV1 &= iVect; TEST_ASSERT(0); } catch (ValueErrorException &dexp) { ; } } { // iV3 = iv1&iV2 SparseIntVect iV1(5),iV2(5),iV3(5); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); iV1.setVal(4,4); iV2.setVal(1,2); iV2.setVal(2,3); iV2.setVal(3,4); iV2.setVal(4,6); iV3 = iV1 & iV2; TEST_ASSERT(iV3[0]==0); TEST_ASSERT(iV3[1]==0); TEST_ASSERT(iV3[2]==1); TEST_ASSERT(iV3[3]==4); TEST_ASSERT(iV3[4]==4); TEST_ASSERT(iV1[0]==2); TEST_ASSERT(iV1[1]==0); TEST_ASSERT(iV1[2]==1); TEST_ASSERT(iV1[3]==4); TEST_ASSERT(iV1[4]==4); TEST_ASSERT(iV2[0]==0); TEST_ASSERT(iV2[1]==2); TEST_ASSERT(iV2[2]==3); TEST_ASSERT(iV2[3]==4); TEST_ASSERT(iV2[4]==6); } { // iV2 &= iV1 SparseIntVect iV1(5),iV2(5); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); iV1.setVal(4,4); iV2.setVal(1,2); iV2.setVal(2,3); iV2.setVal(3,4); iV2.setVal(4,6); iV2 &= iV1; TEST_ASSERT(iV2[0]==0); TEST_ASSERT(iV2[1]==0); TEST_ASSERT(iV2[2]==1); TEST_ASSERT(iV2[3]==4); TEST_ASSERT(iV2[4]==4); TEST_ASSERT(iV1[0]==2); TEST_ASSERT(iV1[1]==0); TEST_ASSERT(iV1[2]==1); TEST_ASSERT(iV1[3]==4); TEST_ASSERT(iV1[4]==4); try { iV2 &= iVect; TEST_ASSERT(0); } catch (ValueErrorException &dexp) { ; } } { // iV1 |= iV2 SparseIntVect iV1(5),iV2(5); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); iV1.setVal(4,4); iV2.setVal(1,2); iV2.setVal(2,3); iV2.setVal(3,4); iV2.setVal(4,6); iV1 |= iV2; TEST_ASSERT(iV1[0]==2); TEST_ASSERT(iV1[1]==2); TEST_ASSERT(iV1[2]==3); TEST_ASSERT(iV1[3]==4); TEST_ASSERT(iV1[4]==6); TEST_ASSERT(iV2[0]==0); TEST_ASSERT(iV2[1]==2); TEST_ASSERT(iV2[2]==3); TEST_ASSERT(iV2[3]==4); TEST_ASSERT(iV2[4]==6); try { iV1 |= iVect; TEST_ASSERT(0); } catch (ValueErrorException &dexp) { ; } } { // iV3 = iv1 |iV2 SparseIntVect iV1(5),iV2(5),iV3(5); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); iV1.setVal(4,4); iV2.setVal(1,2); iV2.setVal(2,3); iV2.setVal(3,4); iV2.setVal(4,6); iV3 = iV1 | iV2; TEST_ASSERT(iV3[0]==2); TEST_ASSERT(iV3[1]==2); TEST_ASSERT(iV3[2]==3); TEST_ASSERT(iV3[3]==4); TEST_ASSERT(iV3[4]==6); TEST_ASSERT(iV1[0]==2); TEST_ASSERT(iV1[1]==0); TEST_ASSERT(iV1[2]==1); TEST_ASSERT(iV1[3]==4); TEST_ASSERT(iV1[4]==4); TEST_ASSERT(iV2[0]==0); TEST_ASSERT(iV2[1]==2); TEST_ASSERT(iV2[2]==3); TEST_ASSERT(iV2[3]==4); TEST_ASSERT(iV2[4]==6); } { // iV2 |= iV1 SparseIntVect iV1(5),iV2(5); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); iV1.setVal(4,4); iV2.setVal(1,2); iV2.setVal(2,3); iV2.setVal(3,4); iV2.setVal(4,6); iV2 |= iV1; TEST_ASSERT(iV2[0]==2); TEST_ASSERT(iV2[1]==2); TEST_ASSERT(iV2[2]==3); TEST_ASSERT(iV2[3]==4); TEST_ASSERT(iV2[4]==6); TEST_ASSERT(iV1[0]==2); TEST_ASSERT(iV1[1]==0); TEST_ASSERT(iV1[2]==1); TEST_ASSERT(iV1[3]==4); TEST_ASSERT(iV1[4]==4); } { // iV1 += iV2 SparseIntVect iV1(5),iV2(5); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); iV1.setVal(4,4); iV2.setVal(1,2); iV2.setVal(2,3); iV2.setVal(3,-4); iV2.setVal(4,6); iV1 += iV2; TEST_ASSERT(iV1[0]==2); TEST_ASSERT(iV1[1]==2); TEST_ASSERT(iV1[2]==4); TEST_ASSERT(iV1[3]==0); TEST_ASSERT(iV1[4]==10); TEST_ASSERT(iV2[0]==0); TEST_ASSERT(iV2[1]==2); TEST_ASSERT(iV2[2]==3); TEST_ASSERT(iV2[3]==-4); TEST_ASSERT(iV2[4]==6); } { // iV3 = IV1 + iV2 SparseIntVect iV1(5),iV2(5),iV3(5); iV1.setVal(2,1); iV1.setVal(0,2); iV1.setVal(4,4); iV1.setVal(3,4); iV2.setVal(1,2); iV2.setVal(2,3); iV2.setVal(3,-4); iV2.setVal(4,6); iV3=iV1+iV2; TEST_ASSERT(iV3[0]==2); TEST_ASSERT(iV3[1]==2); TEST_ASSERT(iV3[2]==4); TEST_ASSERT(iV3[3]==0); TEST_ASSERT(iV3[4]==10); TEST_ASSERT(iV1[0]==2); TEST_ASSERT(iV1[1]==0); TEST_ASSERT(iV1[2]==1); TEST_ASSERT(iV1[3]==4); TEST_ASSERT(iV1[4]==4); TEST_ASSERT(iV2[0]==0); TEST_ASSERT(iV2[1]==2); TEST_ASSERT(iV2[2]==3); TEST_ASSERT(iV2[3]==-4); TEST_ASSERT(iV2[4]==6); } { // iV1 -= iV2 SparseIntVect iV1(5),iV2(5); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); iV1.setVal(4,4); iV2.setVal(1,2); iV2.setVal(2,3); iV2.setVal(3,4); iV2.setVal(4,6); iV1 -= iV2; TEST_ASSERT(iV1[0]==2); TEST_ASSERT(iV1[1]==-2); TEST_ASSERT(iV1[2]==-2); TEST_ASSERT(iV1[3]==0); TEST_ASSERT(iV1[4]==-2); TEST_ASSERT(iV2[0]==0); TEST_ASSERT(iV2[2]==3); TEST_ASSERT(iV2[1]==2); TEST_ASSERT(iV2[4]==6); TEST_ASSERT(iV2[3]==4); } { // iV3 = IV1 - iV2 SparseIntVect iV1(5),iV2(5),iV3(5); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); iV1.setVal(4,4); iV2.setVal(3,4); iV2.setVal(4,6); iV2.setVal(1,2); iV2.setVal(2,3); iV3=iV1-iV2; TEST_ASSERT(iV3[0]==2); TEST_ASSERT(iV3[1]==-2); TEST_ASSERT(iV3[2]==-2); TEST_ASSERT(iV3[3]==0); TEST_ASSERT(iV3[4]==-2); TEST_ASSERT(iV1[0]==2); TEST_ASSERT(iV1[1]==0); TEST_ASSERT(iV1[2]==1); TEST_ASSERT(iV1[3]==4); TEST_ASSERT(iV1[4]==4); TEST_ASSERT(iV2[0]==0); TEST_ASSERT(iV2[1]==2); TEST_ASSERT(iV2[2]==3); TEST_ASSERT(iV2[3]==4); TEST_ASSERT(iV2[4]==6); } { // operator== and operator!= SparseIntVect iV1(5),iV2(5),iV3(3); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); iV1.setVal(4,4); iV2.setVal(1,2); iV2.setVal(2,3); iV2.setVal(3,4); iV2.setVal(4,6); TEST_ASSERT(iV1==iV1); TEST_ASSERT(iV2==iV2); TEST_ASSERT(iV3==iV3); TEST_ASSERT(iV1!=iV2); TEST_ASSERT(iV1!=iV3); TEST_ASSERT(iV2!=iV1); TEST_ASSERT(iV3!=iV1); TEST_ASSERT(iV1!=iV3); } { //test negative values (was sf.net Issue 3295215) SparseIntVect iV1(5),iV2(5); iV1.setVal(0,-2); iV1.setVal(2,1); iV1.setVal(3,-4); iV1.setVal(4,4); iV2.setVal(1,-2); iV2.setVal(2,3); iV2.setVal(3,-4); iV2.setVal(4,6); TEST_ASSERT(feq(DiceSimilarity(iV1,iV2),18./26.)); } } void test7SparseIntVectPickles() { { SparseIntVect iV1(5),iV2(3); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); iV1.setVal(4,4); iV2.setVal(2,3); TEST_ASSERT(iV1!=iV2); std::string pkl; pkl = iV1.toString(); iV2.fromString(pkl); TEST_ASSERT(iV1==iV2); } { SparseIntVect iV1(5); SparseIntVectiV2(3); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); iV2.setVal(1,1); std::string pkl; pkl = iV1.toString(); iV2.fromString(pkl); TEST_ASSERT(iV2.getLength()==iV1.getLength()); TEST_ASSERT(iV2[0]==2) TEST_ASSERT(iV2[1]==0) TEST_ASSERT(iV2[2]==1) TEST_ASSERT(iV2[3]==4) } { SparseIntVect iV1(5); SparseIntVectiV2(3); iV1.setVal(0,2); iV1.setVal(2,1); iV1.setVal(3,4); std::string pkl; pkl = iV1.toString(); try{ iV2.fromString(pkl); TEST_ASSERT(0); } catch (ValueErrorException &dexp) { ; } } } void test8BitVectPickles() { #if 0 { std::string dirName = getenv("RDBASE"); dirName+="/Code/DataStructs/testData/"; std::string pklName = dirName+"test1.bin"; std::ofstream outS; outS.open(pklName.c_str(),std::ios_base::binary); ExplicitBitVect bv(32); for(int i=0;i<32;i+=2){ bv.setBit(i); } std::string pkl=bv.toString(); unsigned int sz=pkl.size(); outS<> length; char *buff = new char[length]; length=inS.readsome(buff,length); inS.close(); std::string pkl(buff,length); delete [] buff; ExplicitBitVect bv(pkl); TEST_ASSERT(bv.getNumBits()==32); TEST_ASSERT(bv.getNumOnBits()==16); TEST_ASSERT(bv[0]); TEST_ASSERT(!bv[1]); } } void test9BitVectFPS() { { ExplicitBitVect bv(32); std::string fps; fps = BitVectToFPSText(bv); TEST_ASSERT(fps=="00000000"); bv.setBit(0); bv.setBit(1); bv.setBit(17); bv.setBit(23); bv.setBit(31); fps = BitVectToFPSText(bv); TEST_ASSERT(fps=="03008280"); } { ExplicitBitVect bv(32),bv2(32); std::string fps; fps = BitVectToFPSText(bv); TEST_ASSERT(fps=="00000000"); UpdateBitVectFromFPSText(bv2,fps); TEST_ASSERT(bv==bv2); bv.setBit(0); bv.setBit(1); bv.setBit(4); bv.setBit(17); bv.setBit(23); bv.setBit(31); fps = BitVectToFPSText(bv); UpdateBitVectFromFPSText(bv2,fps); TEST_ASSERT(bv==bv2); } { ExplicitBitVect bv(33); std::string fps; fps = BitVectToFPSText(bv); TEST_ASSERT(fps=="0000000000"); bv.setBit(0); bv.setBit(32); fps = BitVectToFPSText(bv); TEST_ASSERT(fps=="0100000001"); } { ExplicitBitVect bv(33),bv2(33); std::string fps; fps = BitVectToFPSText(bv); TEST_ASSERT(fps=="0000000000"); UpdateBitVectFromFPSText(bv2,fps); TEST_ASSERT(bv==bv2); bv.setBit(0); bv.setBit(1); bv.setBit(4); bv.setBit(17); bv.setBit(23); bv.setBit(32); fps = BitVectToFPSText(bv); UpdateBitVectFromFPSText(bv2,fps); TEST_ASSERT(bv==bv2); } } void test10BitVectBinaryText() { { ExplicitBitVect bv(32); std::string fps; fps = BitVectToBinaryText(bv); TEST_ASSERT(fps.size()==4); for(unsigned int i=0;i