support operator& and operator|;

some doc cleanups;
fix a problem in the copy ctor for DiscreteValueVect
This commit is contained in:
Greg Landrum
2007-03-15 05:59:08 +00:00
parent a73711e854
commit e66f08dc33
6 changed files with 349 additions and 158 deletions

View File

@@ -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<void *>(data), static_cast<const void *>(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_type<typ){
typ=other.d_type;
}
DiscreteValueVect ans(typ,d_length);
for(unsigned int i=0;i<d_length;++i){
unsigned int v1=getVal(i);
unsigned int v2=other.getVal(i);
if(v1<v2){
ans.setVal(i,v1);
}else{
ans.setVal(i,v2);
}
}
return(ans);
};
DiscreteValueVect DiscreteValueVect::operator|(const DiscreteValueVect &other) const {
PRECONDITION(other.d_length==d_length,"length mismatch");
DiscreteValueType typ=d_type;
if(other.d_type>typ){
typ=other.d_type;
}
DiscreteValueVect ans(typ,d_length);
for(unsigned int i=0;i<d_length;++i){
unsigned int v1=getVal(i);
unsigned int v2=other.getVal(i);
if(v1>v2){
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<<d_bitsPerVal) - 1;
for(unsigned int i=0;i<d_length;++i){
unsigned int v1=getVal(i);
ans.setVal(i,maxVal-v1);
}
return(ans);
};
#endif
} // end of namespace RDKit

View File

@@ -10,13 +10,15 @@
#include <string>
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<unsigned int> 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<unsigned int>(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;

View File

@@ -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,

View File

@@ -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,

View File

@@ -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()

View File

@@ -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;
}