mirror of
https://github.com/rdkit/rdkit.git
synced 2026-06-04 21:54:27 +08:00
initial import
This commit is contained in:
87
Code/DataStructs/DiscreteDistMat.cpp
Normal file
87
Code/DataStructs/DiscreteDistMat.cpp
Normal file
@@ -0,0 +1,87 @@
|
||||
// $Id: DiscreteDistMat.cpp 4946 2006-02-17 01:44:04Z glandrum $
|
||||
//
|
||||
// Copyright (C) 2004-2006 Rational Discovery LLC
|
||||
//
|
||||
// @@ All Rights Reserved @@
|
||||
//
|
||||
#include "DiscreteDistMat.h"
|
||||
#include "DiscreteValueVect.h"
|
||||
#include <iostream>
|
||||
#include "DatastructsException.h"
|
||||
|
||||
void _fillDistMat(unsigned int dmat[], unsigned int nBits) {
|
||||
unsigned int i,j, a, b, ta, tb, dist;
|
||||
int temp;
|
||||
unsigned int mask = ((1<<nBits) -1);
|
||||
for (i = 0; i < 256; ++i) {
|
||||
for (j = 0; j < 256; ++j) {
|
||||
dist = 0;
|
||||
a = i;
|
||||
b = j;
|
||||
while (a || b) {
|
||||
ta = a&mask;
|
||||
tb = b&mask;
|
||||
temp = ta-tb;
|
||||
if (temp > 0) {
|
||||
dist += temp;
|
||||
} else {
|
||||
dist -= temp;
|
||||
}
|
||||
a >>= nBits;
|
||||
b >>= nBits;
|
||||
}
|
||||
dmat[i*256 + j] = dist;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DiscreteDistMat::DiscreteDistMat() {
|
||||
// fill in the distance matrix table
|
||||
|
||||
// one bit per value table
|
||||
_fillDistMat(d_oneBitTab, 1);
|
||||
|
||||
// two bits per value table
|
||||
_fillDistMat(d_twoBitTab, 2);
|
||||
|
||||
// four bits per value table
|
||||
_fillDistMat(d_fourBitTab, 4);
|
||||
}
|
||||
|
||||
unsigned int DiscreteDistMat::getDist(unsigned char v1,
|
||||
unsigned char v2,
|
||||
DiscreteValueVect::DiscreteValueType type) {
|
||||
unsigned int res=0;
|
||||
int temp;
|
||||
unsigned int id = static_cast<unsigned int>(v1)*256 + static_cast<unsigned int>(v2);
|
||||
switch(type) {
|
||||
case DiscreteValueVect::ONEBITVALUE :
|
||||
res = d_oneBitTab[id];
|
||||
break;
|
||||
case DiscreteValueVect::TWOBITVALUE :
|
||||
res = d_twoBitTab[id];
|
||||
break;
|
||||
case DiscreteValueVect::FOURBITVALUE :
|
||||
res = d_fourBitTab[id];
|
||||
break;
|
||||
case DiscreteValueVect::EIGHTBITVALUE :
|
||||
temp = static_cast<unsigned int>(v1) - static_cast<unsigned int>(v2);
|
||||
if (temp < 0) {
|
||||
res -= temp;
|
||||
} else {
|
||||
res += temp;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// ummm.. we shouldn't have come here
|
||||
throw DatastructsException("We shouldn't be here");
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static DiscreteDistMat discreteDMat;
|
||||
DiscreteDistMat *getDiscreteDistMat() {
|
||||
return &discreteDMat;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user