mirror of
https://github.com/rdkit/rdkit.git
synced 2026-06-03 21:44:30 +08:00
support operator& and operator|;
some doc cleanups; fix a problem in the copy ctor for DiscreteValueVect
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user