83 lines
2.7 KiB
C
Executable File
83 lines
2.7 KiB
C
Executable File
/*
|
|
* this is a trimmed-down version of bdz.c with only "search".
|
|
*/
|
|
#include "bdz.h"
|
|
#include "cmph_structs.h"
|
|
#include "bdz_structs.h"
|
|
#include "bitbool.h"
|
|
|
|
#define UNASSIGNED 3U
|
|
|
|
// table used for looking up the number of assigned vertices a 8-bit integer
|
|
const cmph_uint8 bdz_lookup_table[] =
|
|
{
|
|
4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2,
|
|
4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2,
|
|
4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2,
|
|
3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 1,
|
|
4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2,
|
|
4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2,
|
|
4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2,
|
|
3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 1,
|
|
4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2,
|
|
4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2,
|
|
4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2,
|
|
3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 1,
|
|
3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 1,
|
|
3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 1,
|
|
3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 1,
|
|
2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 1, 1, 1, 0
|
|
};
|
|
|
|
static inline cmph_uint32 rank(cmph_uint32 b, cmph_uint32 * ranktable, cmph_uint8 * g, cmph_uint32 vertex)
|
|
{
|
|
register cmph_uint32 index = vertex >> b;
|
|
register cmph_uint32 base_rank = ranktable[index];
|
|
register cmph_uint32 beg_idx_v = index << b;
|
|
register cmph_uint32 beg_idx_b = beg_idx_v >> 2;
|
|
register cmph_uint32 end_idx_b = vertex >> 2;
|
|
while(beg_idx_b < end_idx_b)
|
|
{
|
|
base_rank += bdz_lookup_table[*(g + beg_idx_b++)];
|
|
|
|
}
|
|
beg_idx_v = beg_idx_b << 2;
|
|
while(beg_idx_v < vertex)
|
|
{
|
|
if(GETVALUE(g, beg_idx_v) != UNASSIGNED) base_rank++;
|
|
beg_idx_v++;
|
|
}
|
|
|
|
return base_rank;
|
|
}
|
|
|
|
/** cmph_uint32 bdz_search(void *packed_mphf, const char *key, cmph_uint32 keylen);
|
|
* \brief Use the packed mphf to do a search.
|
|
* \param packed_mphf pointer to the packed mphf
|
|
* \param key key to be hashed
|
|
* \param keylen key legth in bytes
|
|
* \return The mphf value
|
|
*/
|
|
cmph_uint32 bdz_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen)
|
|
{
|
|
|
|
register cmph_uint32 vertex;
|
|
register CMPH_HASH hl_type = (CMPH_HASH)(*(cmph_uint32 *)packed_mphf);
|
|
register cmph_uint8 *hl_ptr = (cmph_uint8 *)(packed_mphf) + 4;
|
|
|
|
register cmph_uint32 *ranktable = (cmph_uint32*)(hl_ptr + hash_state_packed_size(hl_type));
|
|
|
|
register cmph_uint32 r = *ranktable++;
|
|
register cmph_uint32 ranktablesize = *ranktable++;
|
|
register cmph_uint8 * g = (cmph_uint8 *)(ranktable + ranktablesize);
|
|
register cmph_uint8 b = *g++;
|
|
|
|
cmph_uint32 hl[3];
|
|
hash_vector_packed(hl_ptr, hl_type, key, keylen, hl);
|
|
hl[0] = hl[0] % r;
|
|
hl[1] = hl[1] % r + r;
|
|
hl[2] = hl[2] % r + (r << 1);
|
|
vertex = hl[(GETVALUE(g, hl[0]) + GETVALUE(g, hl[1]) + GETVALUE(g, hl[2])) % 3];
|
|
return rank(b, ranktable, g, vertex);
|
|
}
|