parent
ac71195144
commit
eaa56ad32a
@ -0,0 +1,82 @@ |
||||
/*
|
||||
* 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); |
||||
} |
Loading…
Reference in new issue