// $Id$ // // Copyright (C) 2001-2006 Rational Discovery LLC // // @@ All Rights Reserved @@ // #include #include #include #include #include "BitVects.h" #include "BitOps.h" #include "BitVectUtils.h" #include #include "DiscreteValueVect.h" #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()); 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]); t2 = t1; //onBits = t2.GetOnBits(); TXTMSG("t2[19]:",t2[19]); t2.UnSetBit(14); TXTMSG("t2[14]:",t2[14]); t2.SetBit(15); t2.SetBit(17); cout << "t1: "; t1.GetOnBits(onBits); std::copy(onBits.begin(),onBits.end(),std::ostream_iterator(std::cout,", ")); std::cout << std::endl; cout << "t2: "; t2.GetOnBits(onBits); std::copy(onBits.begin(),onBits.end(),std::ostream_iterator(std::cout,", ")); std::cout << std::endl; 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; cout << "t1&t2: "; t3=t1 & t2; t3.GetOnBits(onBits); std::copy(onBits.begin(),onBits.end(),std::ostream_iterator(std::cout,", ")); std::cout << std::endl; cout << "t1^t2: "; t3=t1 ^ t2; t3.GetOnBits(onBits); std::copy(onBits.begin(),onBits.end(),std::ostream_iterator(std::cout,", ")); std::cout << std::endl; 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) { cout << " except " << endl; } catch (...) { cout << " ERROR EXCEPT " << endl; } T t4(t1.ToString()); cout << "tan(t1,t4): " << TanimotoSimilarity(t1,t4) << endl; 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; } 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 = SimilarityWrapper(v1,v2,TanimotoSimilarity); TEST_ASSERT(feq(tani,dists[idx])); tani = SimilarityWrapper(v1,v2,TanimotoSimilarity,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.)); 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); } } 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) { ; } } } int main(){ RDLog::InitLogs(); try{ throw IndexErrorException(3); } catch (IndexErrorException) { cerr << "pass" << endl; } stringstream ss(ios_base::binary|ios_base::out|ios_base::in); int v1=4,v2=5,v3,v4; ss.write((const char *)&v1,sizeof(v1)); ss.write((const char *)&v2,sizeof(v2)); #if 0 ss.close(); fstream ss2("blah.bin",ios_base::binary|ios_base::in); ss2.read((char *)&v3,sizeof(v3)); ss2.read((char *)&v4,sizeof(v4)); #endif ss.seekp(0,ios_base::beg); ss.read((char *)&v3,sizeof(v3)); ss.read((char *)&v4,sizeof(v4)); TXTMSG("v3",v3); TXTMSG("v4",v4); std::cerr << " SPARSE -----------------------------------------" << std::endl; SparseBitVect sparseFoo(10); Test(sparseFoo); TaniTest(sparseFoo); ProbeTest(sparseFoo); std::cerr << " Explicit -----------------------------------------" << std::endl; ExplicitBitVect explicitFoo(10); Test(explicitFoo); TaniTest(explicitFoo); std::cerr << " Done" << std::endl; std::cout << " Test DiscreteValue Vectors 1 ------------------------------------" << endl; test1DiscreteVect(); std::cout << " Test DiscreteValue Vectors 2 ------------------------------------" << endl; test2DiscreteVectDists(); std::cout << " Test DiscreteValue Vectors 3 ------------------------------------" << endl; test3DiscreteVectPickles(); std::cout << " Test DiscreteValue Operations ------------------------------------" << endl; test4DiscreteVectOps1(); std::cout << " Test DiscreteValue Operations 2 ------------------------------------" << endl; test5DiscreteVectOps2(); std::cout << " Test SparseIntVect ------------------------------------" << std::endl; test6SparseIntVect(); std::cout << " Test SparseIntVect Serialization ------------------------------------" << std::endl; test7SparseIntVectPickles(); return 0; }