diff --git a/Code/DataStructs/DiscreteValueVect.cpp b/Code/DataStructs/DiscreteValueVect.cpp index 757e0e9c0..9b633799e 100644 --- a/Code/DataStructs/DiscreteValueVect.cpp +++ b/Code/DataStructs/DiscreteValueVect.cpp @@ -1,5 +1,6 @@ +// $Id$ // -// Copyright (C) 2004-2006 Rational Discovery LLC +// Copyright (C) 2004-2007 Greg Landrum and Rational Discovery LLC // // @@ All Rights Reserved @@ // @@ -18,7 +19,8 @@ namespace RDKit { d_bitsPerVal = other.getNumBitsPerVal(); d_numInts = other.getNumInts(); d_length = other.getLength(); - d_valsPerInt = BITS_PER_INT/d_bitsPerVal; + d_valsPerInt = other.d_valsPerInt; + d_mask = other.d_mask; const unsigned int *odata = other.getData(); unsigned int *data = new unsigned int[d_numInts]; memcpy(static_cast(data), static_cast(odata), @@ -156,4 +158,57 @@ namespace RDKit { d_data.reset(data); }; + + DiscreteValueVect DiscreteValueVect::operator& (const DiscreteValueVect &other) const { + PRECONDITION(other.d_length==d_length,"length mismatch"); + DiscreteValueType typ=d_type; + if(other.d_typetyp){ + typ=other.d_type; + } + DiscreteValueVect ans(typ,d_length); + for(unsigned int i=0;iv2){ + ans.setVal(i,v1); + }else{ + ans.setVal(i,v2); + } + } + return(ans); + }; + +#if 0 + DiscreteValueVect DiscreteValueVect::operator~() const { + DiscreteValueVect ans(d_type,d_length); + unsigned int maxVal = (1< namespace RDKit{ - // we are making an assumption here that and unsigned int is 32 bits long + // we are making an assumption here that an unsigned int is 32 bits long const unsigned int BITS_PER_INT=32; + //! a class for efficiently storing vectors of discrete values class DiscreteValueVect { public: typedef boost::shared_array DATA_SPTR; + //! used to define the possible range of the values typedef enum { ONEBITVALUE=0, TWOBITVALUE, @@ -25,6 +27,7 @@ namespace RDKit{ SIXTEENBITVALUE, } DiscreteValueType; + //! initialize with a particular type and size DiscreteValueVect(DiscreteValueType valType, unsigned int length) : d_type(valType), d_length(length) { d_bitsPerVal = (1 << static_cast(valType)); d_valsPerInt = BITS_PER_INT/d_bitsPerVal; @@ -38,35 +41,73 @@ namespace RDKit{ //! Copy constructor DiscreteValueVect(const DiscreteValueVect& other); - //! constructors from pickles + //! constructor from a pickle DiscreteValueVect(const std::string pkl){ initFromText(pkl.c_str(),pkl.size()); }; + //! constructor from a pickle DiscreteValueVect(const char *pkl,const unsigned int len){ initFromText(pkl,len); }; ~DiscreteValueVect() {} + //! return the value at an index unsigned int getVal(unsigned int i) const; + //! set the value at an index + /*! + NOTE: it is an error to have val > the max value this + DiscreteValueVect can accomodate + */ void setVal(unsigned int i, unsigned int val); + + //! returns the sum of all the elements in the vect unsigned int getTotalVal() const; + //! returns the length unsigned int getLength() const; + //! return a pointer to our raw data storage const unsigned int *getData() const; + + //! return the number of bits used to store each value unsigned int getNumBitsPerVal() const { return d_bitsPerVal; } + //! return the type of value being stored DiscreteValueType getValueType() const { return d_type; } + //! returns the size of our storage unsigned int getNumInts() const { return d_numInts; } + //! support dvv3 = dvv1&dvv2 + /*! + + operator& returns the minimum value for each element. + e.g.: + [0,1,2,0] & [0,1,1,1] -> [0,1,1,0] + + */ + DiscreteValueVect operator& (const DiscreteValueVect &other) const; + //! support dvv3 = dvv1|dvv2 + /*! + + operator& returns the maximum value for each element. + e.g.: + [0,1,2,0] | [0,1,1,1] -> [0,1,2,1] + + */ + DiscreteValueVect operator| (const DiscreteValueVect &other) const; + //DiscreteValueVect operator^ (const DiscreteValueVect &other) const; + //DiscreteValueVect operator~ () const; + + + //! returns a binary string representation (pickle) std::string toString() const; private: DiscreteValueType d_type; diff --git a/Code/DataStructs/ExplicitBitVect.h b/Code/DataStructs/ExplicitBitVect.h index bf5c72161..100e6bfc8 100755 --- a/Code/DataStructs/ExplicitBitVect.h +++ b/Code/DataStructs/ExplicitBitVect.h @@ -11,7 +11,7 @@ //! a class for bit vectors that are densely occupied /*! - ExplicitBitVect objects store all of their bits, using + ExplicitBitVect objects store all of their bits using a boost::dynamic_bitset These are very fast, but can require large amounts of memory for large, diff --git a/Code/DataStructs/Wrap/DiscreteValueVect.cpp b/Code/DataStructs/Wrap/DiscreteValueVect.cpp index d80962542..42efbc85b 100644 --- a/Code/DataStructs/Wrap/DiscreteValueVect.cpp +++ b/Code/DataStructs/Wrap/DiscreteValueVect.cpp @@ -44,6 +44,8 @@ struct discreteValVec_wrapper { "Set the value at a specified location") .def("__getitem__", &DiscreteValueVect::getVal, "Get the value at a specified location") + .def(python::self & python::self) + .def(python::self | python::self) .def("GetValueType", &DiscreteValueVect::getValueType, "Get the type of value stored in the vector") .def("GetTotalVal", &DiscreteValueVect::getTotalVal, diff --git a/Code/DataStructs/Wrap/testDiscreteValueVect.py b/Code/DataStructs/Wrap/testDiscreteValueVect.py index 8086f4b2e..41d35047d 100644 --- a/Code/DataStructs/Wrap/testDiscreteValueVect.py +++ b/Code/DataStructs/Wrap/testDiscreteValueVect.py @@ -4,153 +4,175 @@ import unittest import DataStructs as ds class TestCase(unittest.TestCase): - def setUp(self) : - pass + def setUp(self) : + pass - def test1Discrete(self): - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.ONEBITVALUE, 30) - for i in range(15): - v1[2*i] = 1; + def test1Discrete(self): + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.ONEBITVALUE, 30) + for i in range(15): + v1[2*i] = 1; - self.failUnless(len(v1) == 30) - self.failUnless(v1.GetTotalVal() == 15) + self.failUnless(len(v1) == 30) + self.failUnless(v1.GetTotalVal() == 15) - for i in range(len(v1)): - self.failUnless(v1[i] == (i+1)%2) + for i in range(len(v1)): + self.failUnless(v1[i] == (i+1)%2) - self.failUnlessRaises(ValueError, lambda : v1.__setitem__(5, 2)) + self.failUnlessRaises(ValueError, lambda : v1.__setitem__(5, 2)) - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.TWOBITVALUE, 30) - for i in range(len(v1)): - v1[i] = i%4; + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.TWOBITVALUE, 30) + for i in range(len(v1)): + v1[i] = i%4; - self.failUnless(len(v1) == 30) - for i in range(len(v1)): - self.failUnless(v1[i] == i%4) + self.failUnless(len(v1) == 30) + for i in range(len(v1)): + self.failUnless(v1[i] == i%4) - self.failUnlessRaises(ValueError, lambda : v1.__setitem__(10, 6)) + self.failUnlessRaises(ValueError, lambda : v1.__setitem__(10, 6)) - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.FOURBITVALUE, 30) - for i in range(len(v1)): - v1[i] = i%16; - - self.failUnless(len(v1) == 30) - self.failUnless(v1.GetTotalVal() == 211) - for i in range(len(v1)): - self.failUnless(v1[i] == i%16) + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.FOURBITVALUE, 30) + for i in range(len(v1)): + v1[i] = i%16; - self.failUnlessRaises(ValueError, lambda : v1.__setitem__(10, 16)) + self.failUnless(len(v1) == 30) + self.failUnless(v1.GetTotalVal() == 211) + for i in range(len(v1)): + self.failUnless(v1[i] == i%16) - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.EIGHTBITVALUE, 32) - for i in range(len(v1)): - v1[i] = i%256; - - self.failUnless(len(v1) == 32) - self.failUnless(v1.GetTotalVal() == 496) - for i in range(len(v1)): - self.failUnless(v1[i] == i%256) + self.failUnlessRaises(ValueError, lambda : v1.__setitem__(10, 16)) - self.failUnlessRaises(ValueError, lambda : v1.__setitem__(10, 256)) + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.EIGHTBITVALUE, 32) + for i in range(len(v1)): + v1[i] = i%256; - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.SIXTEENBITVALUE, 300) - for i in range(len(v1)): - v1[i] = i%300; - - self.failUnless(len(v1) == 300) - self.failUnless(v1.GetTotalVal() == 44850) - self.failUnlessRaises(ValueError, lambda : v1.__setitem__(10, 65536)) + self.failUnless(len(v1) == 32) + self.failUnless(v1.GetTotalVal() == 496) + for i in range(len(v1)): + self.failUnless(v1[i] == i%256) - def test2VectDistances(self): - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.ONEBITVALUE, 30) - v2 = ds.DiscreteValueVect(ds.DiscreteValueType.ONEBITVALUE, 30) - for i in range(15): - v1[2*i] = 1 - v2[2*i] = 1 - self.failUnless(ds.ComputeL1Norm(v1, v2) == 0) - for i in range(30): - if (i%3 == 0): - v2[i] = 1 - else: - v2[i] = 0 - self.failUnless(ds.ComputeL1Norm(v1, v2) == 15) + self.failUnlessRaises(ValueError, lambda : v1.__setitem__(10, 256)) - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.TWOBITVALUE, 30) - v2 = ds.DiscreteValueVect(ds.DiscreteValueType.TWOBITVALUE, 30) - - for i in range(30): - v1[i] = i%4 - v2[i] = (i+1)%4 - - self.failUnless(ds.ComputeL1Norm(v1, v2) == 44) - - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.FOURBITVALUE, 16) - v2 = ds.DiscreteValueVect(ds.DiscreteValueType.FOURBITVALUE, 16) - for i in range(16): - v1[i] = i%16 - v2[i] = i%5 - self.failUnless(ds.ComputeL1Norm(v1, v2) == 90) - - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.EIGHTBITVALUE, 5) - v2 = ds.DiscreteValueVect(ds.DiscreteValueType.EIGHTBITVALUE, 5) - v1[0] = 34 - v1[1] = 167 - v1[2] = 3 - v1[3] = 56 - v1[4] = 128 + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.SIXTEENBITVALUE, 300) + for i in range(len(v1)): + v1[i] = i%300; - v2[0] = 14 - v2[1] = 67 - v2[2] = 103 - v2[3] = 6 - v2[4] = 228 - self.failUnless(ds.ComputeL1Norm(v1, v2) == 370) + self.failUnless(len(v1) == 300) + self.failUnless(v1.GetTotalVal() == 44850) + self.failUnlessRaises(ValueError, lambda : v1.__setitem__(10, 65536)) + def test2VectDistances(self): + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.ONEBITVALUE, 30) + v2 = ds.DiscreteValueVect(ds.DiscreteValueType.ONEBITVALUE, 30) + for i in range(15): + v1[2*i] = 1 + v2[2*i] = 1 + self.failUnless(ds.ComputeL1Norm(v1, v2) == 0) + for i in range(30): + if (i%3 == 0): + v2[i] = 1 + else: + v2[i] = 0 + self.failUnless(ds.ComputeL1Norm(v1, v2) == 15) - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.SIXTEENBITVALUE, 3) - v2 = ds.DiscreteValueVect(ds.DiscreteValueType.SIXTEENBITVALUE, 3) - v1[0] = 2345 - v1[1] = 64578 - v1[2] = 34 + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.TWOBITVALUE, 30) + v2 = ds.DiscreteValueVect(ds.DiscreteValueType.TWOBITVALUE, 30) - v2[0] = 1345 - v2[1] = 54578 - v2[2] = 10034 - self.failUnless(ds.ComputeL1Norm(v1, v2) == 21000) + for i in range(30): + v1[i] = i%4 + v2[i] = (i+1)%4 - def test3Pickles(self): - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.ONEBITVALUE, 30) - for i in range(15): - v1[2*i] = 1 - v2 = cPickle.loads(cPickle.dumps(v1)) - self.failUnless(ds.ComputeL1Norm(v1, v2) == 0) + self.failUnless(ds.ComputeL1Norm(v1, v2) == 44) - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.TWOBITVALUE, 30) - for i in range(30): - v1[i] = i%4 - v2 = cPickle.loads(cPickle.dumps(v1)) - self.failUnless(ds.ComputeL1Norm(v1, v2) == 0) + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.FOURBITVALUE, 16) + v2 = ds.DiscreteValueVect(ds.DiscreteValueType.FOURBITVALUE, 16) + for i in range(16): + v1[i] = i%16 + v2[i] = i%5 + self.failUnless(ds.ComputeL1Norm(v1, v2) == 90) - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.FOURBITVALUE, 16) - for i in range(16): - v1[i] = i%16 - v2 = cPickle.loads(cPickle.dumps(v1)) - self.failUnless(ds.ComputeL1Norm(v1, v2) == 0) + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.EIGHTBITVALUE, 5) + v2 = ds.DiscreteValueVect(ds.DiscreteValueType.EIGHTBITVALUE, 5) + v1[0] = 34 + v1[1] = 167 + v1[2] = 3 + v1[3] = 56 + v1[4] = 128 - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.EIGHTBITVALUE, 5) - v1[0] = 34 - v1[1] = 167 - v1[2] = 3 - v1[3] = 56 - v1[4] = 128 - v2 = cPickle.loads(cPickle.dumps(v1)) - self.failUnless(ds.ComputeL1Norm(v1, v2) == 0) + v2[0] = 14 + v2[1] = 67 + v2[2] = 103 + v2[3] = 6 + v2[4] = 228 + self.failUnless(ds.ComputeL1Norm(v1, v2) == 370) + + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.SIXTEENBITVALUE, 3) + v2 = ds.DiscreteValueVect(ds.DiscreteValueType.SIXTEENBITVALUE, 3) + v1[0] = 2345 + v1[1] = 64578 + v1[2] = 34 + + v2[0] = 1345 + v2[1] = 54578 + v2[2] = 10034 + self.failUnless(ds.ComputeL1Norm(v1, v2) == 21000) + + def test3Pickles(self): + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.ONEBITVALUE, 30) + for i in range(15): + v1[2*i] = 1 + v2 = cPickle.loads(cPickle.dumps(v1)) + self.failUnless(ds.ComputeL1Norm(v1, v2) == 0) + + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.TWOBITVALUE, 30) + for i in range(30): + v1[i] = i%4 + v2 = cPickle.loads(cPickle.dumps(v1)) + self.failUnless(ds.ComputeL1Norm(v1, v2) == 0) + + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.FOURBITVALUE, 16) + for i in range(16): + v1[i] = i%16 + v2 = cPickle.loads(cPickle.dumps(v1)) + self.failUnless(ds.ComputeL1Norm(v1, v2) == 0) + + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.EIGHTBITVALUE, 5) + v1[0] = 34 + v1[1] = 167 + v1[2] = 3 + v1[3] = 56 + v1[4] = 128 + v2 = cPickle.loads(cPickle.dumps(v1)) + self.failUnless(ds.ComputeL1Norm(v1, v2) == 0) - v1 = ds.DiscreteValueVect(ds.DiscreteValueType.SIXTEENBITVALUE, 3) - v1[0] = 2345 - v1[1] = 64578 - v1[2] = 34 - v2 = cPickle.loads(cPickle.dumps(v1)) - self.failUnless(ds.ComputeL1Norm(v1, v2) == 0) - + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.SIXTEENBITVALUE, 3) + v1[0] = 2345 + v1[1] = 64578 + v1[2] = 34 + v2 = cPickle.loads(cPickle.dumps(v1)) + self.failUnless(ds.ComputeL1Norm(v1, v2) == 0) + + def test4DiscreteVectOps(self): + v1 = ds.DiscreteValueVect(ds.DiscreteValueType.TWOBITVALUE, 8) + for i in range(4): + v1[2*i] = 2 + self.failUnless(v1.GetTotalVal()==8) + v2 = ds.DiscreteValueVect(ds.DiscreteValueType.TWOBITVALUE, 8) + for i in range(4): + v2[2*i+1] = 2 + v2[2*i] = 1 + self.failUnless(v2.GetTotalVal()==12) + for i in range(len(v2)): print v2[i] + print '----' + v3 = v1|v2 + self.failUnless(len(v3)==len(v2)) + for i in range(len(v3)): print v3[i] + self.failUnless(v3.GetTotalVal()==16) + + v3 = v1&v2 + self.failUnless(len(v3)==len(v2)) + print v3.GetTotalVal() + self.failUnless(v3.GetTotalVal()==4) + + if __name__ == '__main__': unittest.main() diff --git a/Code/DataStructs/testDatastructs.cpp b/Code/DataStructs/testDatastructs.cpp index 9d41e325a..522ba8fa0 100644 --- a/Code/DataStructs/testDatastructs.cpp +++ b/Code/DataStructs/testDatastructs.cpp @@ -168,10 +168,10 @@ void test1DiscreteVect() { vect1.setVal(2*i, 1); } - CHECK_INVARIANT(vect1.getLength() == 30, ""); - CHECK_INVARIANT(vect1.getTotalVal() == 15, ""); + TEST_ASSERT(vect1.getLength() == 30); + TEST_ASSERT(vect1.getTotalVal() == 15); for (i = 0; i < vect1.getLength(); ++i) { - CHECK_INVARIANT(vect1.getVal(i) == (i+1)%2, ""); + TEST_ASSERT(vect1.getVal(i) == (i+1)%2); } try { vect1.setVal(28,2); @@ -187,9 +187,9 @@ void test1DiscreteVect() { } for (i = 0; i < vect2.getLength(); ++i) { - CHECK_INVARIANT(vect2.getVal(i) == i%4, ""); + TEST_ASSERT(vect2.getVal(i) == i%4); } - CHECK_INVARIANT(vect2.getTotalVal() == 43, ""); + TEST_ASSERT(vect2.getTotalVal() == 43); try { vect2.setVal(28,10); } catch (ValueErrorException &dexp) { @@ -202,9 +202,9 @@ void test1DiscreteVect() { } for (i = 0; i < vect4.getLength(); ++i) { - CHECK_INVARIANT(vect4.getVal(i) == i%16, ""); + TEST_ASSERT(vect4.getVal(i) == i%16); } - CHECK_INVARIANT(vect4.getTotalVal() == 211, ""); + TEST_ASSERT(vect4.getTotalVal() == 211); try { vect4.setVal(28,16); } catch (ValueErrorException &dexp) { @@ -217,9 +217,9 @@ void test1DiscreteVect() { } for (i = 0; i < vect8.getLength(); ++i) { - CHECK_INVARIANT(vect8.getVal(i) == i%256, ""); + TEST_ASSERT(vect8.getVal(i) == i%256); } - CHECK_INVARIANT(vect8.getTotalVal() == 496, ""); + TEST_ASSERT(vect8.getTotalVal() == 496); try { vect8.setVal(28,257); } catch (ValueErrorException &dexp) { @@ -232,10 +232,10 @@ void test1DiscreteVect() { } for (i = 0; i < vect16.getLength(); ++i) { - CHECK_INVARIANT(vect16.getVal(i) == i%300, ""); + TEST_ASSERT(vect16.getVal(i) == i%300); } - CHECK_INVARIANT(vect16.getTotalVal() == 44850, ""); + TEST_ASSERT(vect16.getTotalVal() == 44850); vect16.setVal(28,65535); try { vect16.setVal(28,65536); @@ -253,12 +253,12 @@ void test2DiscreteVectDists() { v1.setVal(2*i, 1); v2.setVal(2*i, 1); } - CHECK_INVARIANT(computeL1Norm(v1, v2) == 0, " "); + TEST_ASSERT(computeL1Norm(v1, v2) == 0); for (i = 0; i < 30; ++i) { v2.setVal(i, i%2); } - CHECK_INVARIANT(computeL1Norm(v1, v2) == 30, " "); + TEST_ASSERT(computeL1Norm(v1, v2) == 30); for (i = 0; i < 30; ++i) { if (i%3 == 0) { @@ -268,7 +268,7 @@ void test2DiscreteVectDists() { } } - CHECK_INVARIANT(computeL1Norm(v1, v2) == 15, " "); + TEST_ASSERT(computeL1Norm(v1, v2) == 15); DiscreteValueVect v21(DiscreteValueVect::TWOBITVALUE, 30); DiscreteValueVect v22(DiscreteValueVect::TWOBITVALUE, 30); @@ -276,11 +276,11 @@ void test2DiscreteVectDists() { v21.setVal(i, i%4); v22.setVal(i, i%4); } - CHECK_INVARIANT(computeL1Norm(v21, v22) == 0, " "); + TEST_ASSERT(computeL1Norm(v21, v22) == 0); for (i = 0; i < 30; ++i) { v22.setVal(i, (i+1)%4); } - CHECK_INVARIANT(computeL1Norm(v21, v22) == 44, " "); + TEST_ASSERT(computeL1Norm(v21, v22) == 44); DiscreteValueVect v41(DiscreteValueVect::FOURBITVALUE, 16); DiscreteValueVect v42(DiscreteValueVect::FOURBITVALUE, 16); @@ -288,15 +288,15 @@ void test2DiscreteVectDists() { v41.setVal(i, i%16); v42.setVal(i, i%16); } - CHECK_INVARIANT(computeL1Norm(v41, v42) == 0, " "); + TEST_ASSERT(computeL1Norm(v41, v42) == 0); for (i = 0; i < 16; ++i) { v42.setVal(i, i%5); } - CHECK_INVARIANT(computeL1Norm(v41, v42) ==90, " "); + TEST_ASSERT(computeL1Norm(v41, v42) ==90); DiscreteValueVect v43(v42); - CHECK_INVARIANT(computeL1Norm(v42, v43) == 0, " "); + TEST_ASSERT(computeL1Norm(v42, v43) == 0); DiscreteValueVect v81(DiscreteValueVect::EIGHTBITVALUE, 5); DiscreteValueVect v82(DiscreteValueVect::EIGHTBITVALUE, 5); @@ -305,24 +305,24 @@ void test2DiscreteVectDists() { v81.setVal(2, 3); v82.setVal(2, 3); v81.setVal(3, 56); v82.setVal(3, 56); v81.setVal(4, 128); v82.setVal(4, 128); - CHECK_INVARIANT(computeL1Norm(v81, v82) == 0, " "); + TEST_ASSERT(computeL1Norm(v81, v82) == 0); v82.setVal(0, 14); v82.setVal(1, 67); v82.setVal(2, 103); v82.setVal(3, 6); v82.setVal(4, 228); - CHECK_INVARIANT(computeL1Norm(v81, v82) == 370, ""); + TEST_ASSERT(computeL1Norm(v81, v82) == 370); DiscreteValueVect v161(DiscreteValueVect::SIXTEENBITVALUE, 3); DiscreteValueVect v162(DiscreteValueVect::SIXTEENBITVALUE, 3); v161.setVal(0, 2345); v162.setVal(0, 2345); v161.setVal(1, 64578); v162.setVal(1, 64578); v161.setVal(2, 34); v162.setVal(2, 34); - CHECK_INVARIANT(computeL1Norm(v161, v162) == 0, " "); + TEST_ASSERT(computeL1Norm(v161, v162) == 0); v162.setVal(0, 1345); v162.setVal(1, 54578); v162.setVal(2, 10034); - CHECK_INVARIANT(computeL1Norm(v161, v162) == 21000, " "); + TEST_ASSERT(computeL1Norm(v161, v162) == 21000); } @@ -333,21 +333,21 @@ void test3DiscreteVectPickles() { v1.setVal(2*i, 1); } DiscreteValueVect v2(v1.toString()); - CHECK_INVARIANT(computeL1Norm(v1, v2) == 0, " "); + TEST_ASSERT(computeL1Norm(v1, v2) == 0); DiscreteValueVect v21(DiscreteValueVect::TWOBITVALUE, 30); for (i = 0; i < 30; ++i) { v21.setVal(i, i%4); } DiscreteValueVect v22(v21.toString()); - CHECK_INVARIANT(computeL1Norm(v21, v22) == 0, " "); + TEST_ASSERT(computeL1Norm(v21, v22) == 0); DiscreteValueVect v41(DiscreteValueVect::FOURBITVALUE, 16); for (i = 0; i < 16; ++i) { v41.setVal(i, i%16); } DiscreteValueVect v42(v41.toString()); - CHECK_INVARIANT(computeL1Norm(v41, v42) == 0, " "); + TEST_ASSERT(computeL1Norm(v41, v42) == 0); DiscreteValueVect v81(DiscreteValueVect::EIGHTBITVALUE, 5); v81.setVal(0, 34); @@ -356,17 +356,82 @@ void test3DiscreteVectPickles() { v81.setVal(3, 56); v81.setVal(4, 128); DiscreteValueVect v82(v81.toString()); - CHECK_INVARIANT(computeL1Norm(v81, v82) == 0, " "); + TEST_ASSERT(computeL1Norm(v81, v82) == 0); DiscreteValueVect v161(DiscreteValueVect::SIXTEENBITVALUE, 3); v161.setVal(0, 2345); v161.setVal(1, 64578); v161.setVal(2, 34); DiscreteValueVect v162(v161.toString()); - CHECK_INVARIANT(computeL1Norm(v161, v162) == 0, " "); + TEST_ASSERT(computeL1Norm(v161, v162) == 0); +} + + +void test4DiscreteVectOps1() { + DiscreteValueVect vect1(DiscreteValueVect::ONEBITVALUE, 8); + for (unsigned int i = 0; i < 4; ++i) { + vect1.setVal(2*i, 1); + } + TEST_ASSERT(vect1.getLength() == 8); + TEST_ASSERT(vect1.getTotalVal() == 4); + + DiscreteValueVect vect2(DiscreteValueVect::ONEBITVALUE, 8); + for (unsigned int i = 0; i < 4; ++i) { + vect2.setVal(2*i+1, 1); + } + TEST_ASSERT(vect2.getTotalVal() == 4); + + DiscreteValueVect vect3=vect1&vect2; + TEST_ASSERT(vect3.getLength() == 8); + TEST_ASSERT(vect3.getTotalVal() == 0); + + DiscreteValueVect vect4=vect1|vect2; + TEST_ASSERT(vect4.getLength() == 8); + TEST_ASSERT(vect4.getTotalVal() == 8); +#if 0 + DiscreteValueVect vect5=~vect1; + TEST_ASSERT(vect5.getLength() == 8); + TEST_ASSERT(vect5.getTotalVal() == 4); + + TEST_ASSERT((vect5&vect1).getTotalVal()==0); + TEST_ASSERT((vect5&vect2).getTotalVal()==4); +#endif +} + +void test5DiscreteVectOps2() { + DiscreteValueVect vect1(DiscreteValueVect::TWOBITVALUE, 8); + for (unsigned int i = 0; i < 4; ++i) { + vect1.setVal(2*i, 2); + } + TEST_ASSERT(vect1.getLength() == 8); + TEST_ASSERT(vect1.getTotalVal() == 8); + + DiscreteValueVect vect2(DiscreteValueVect::TWOBITVALUE, 8); + for (unsigned int i = 0; i < 4; ++i) { + vect2.setVal(2*i+1, 2); + vect2.setVal(2*i, 1); + } + TEST_ASSERT(vect2.getTotalVal() == 12); + + DiscreteValueVect vect3=vect1&vect2; + TEST_ASSERT(vect3.getLength() == 8); + TEST_ASSERT(vect3.getTotalVal() == 4); + + DiscreteValueVect vect4=vect1|vect2; + TEST_ASSERT(vect4.getLength() == 8); + TEST_ASSERT(vect4.getTotalVal() == 16); +#if 0 + DiscreteValueVect vect5=~vect1; + TEST_ASSERT(vect5.getLength() == 8); + TEST_ASSERT(vect5.getTotalVal() == 16); + + TEST_ASSERT((vect5&vect1).getTotalVal()==4); + TEST_ASSERT((vect5&vect2).getTotalVal()==12); +#endif } int main(){ + RDLog::InitLogs(); try{ throw IndexErrorException(3); } catch (IndexErrorException) { @@ -409,6 +474,12 @@ int main(){ std::cout << " Test DiscreteValue Vectors 3 ------------------------------------" << endl; test3DiscreteVectPickles(); + std::cout << " Test DiscreteValue Operations ------------------------------------" << endl; + test4DiscreteVectOps1(); + + std::cout << " Test DiscreteValue Operations 2 ------------------------------------" << endl; + test5DiscreteVectOps2(); + return 0; }