diff --git a/hyperpoint.cpp b/hyperpoint.cpp index 47ce45d3..d0b8d14c 100644 --- a/hyperpoint.cpp +++ b/hyperpoint.cpp @@ -1834,22 +1834,31 @@ EX ld raddif(ld a, ld b) { EX int bucket_scale = 10000; -EX unsigned bucketer(ld x) { - return (unsigned) (long long) (floor(x * bucket_scale + .5)); +#if HDR +using buckethash_t = uint64_t; + +inline void hashmix(buckethash_t& seed, buckethash_t i) { seed ^= i + 0x9e3779b9 + (seed << 6) + (seed >> 2); } +inline buckethash_t hashmix_to(buckethash_t seed, buckethash_t i) { hashmix(seed, i); return seed; } +#endif + +EX buckethash_t bucketer(ld x) { + return (buckethash_t) (long long) (floor(x * bucket_scale + .5)); } -EX unsigned bucketer(hyperpoint h) { - unsigned dx = 0; +EX buckethash_t bucketer(hyperpoint h) { + buckethash_t seed = 0; if(gproduct) { auto d = product_decompose(h); h = d.second; - dx += bucketer(d.first) * 50; + hashmix(seed, bucketer(d.first)); if(cgi.emb->is_euc_in_product() && in_h2xe()) h /= h[2]; } - dx += bucketer(h[0]) + 1000 * bucketer(h[1]) + 1000000 * bucketer(h[2]); - if(MDIM == 4) dx += bucketer(h[3]) * 1000000001; - if(elliptic) dx = min(dx, -dx); - return dx; + if(elliptic && make_tuple(h[0], h[1], h[2], h[3]) < make_tuple(-h[0], -h[1], -h[2], -h[3])) h = -h; + hashmix(seed, bucketer(h[0])); + hashmix(seed, bucketer(h[1])); + hashmix(seed, bucketer(h[2])); + if(MDIM == 4) hashmix(seed, bucketer(h[3])); + return seed; } #if MAXMDIM >= 4 diff --git a/hypgraph.cpp b/hypgraph.cpp index d83adada..50b9eefb 100644 --- a/hypgraph.cpp +++ b/hypgraph.cpp @@ -3272,12 +3272,12 @@ EX shiftmatrix optimized_shift(const shiftmatrix& T) { EX namespace dq { EX queue> drawqueue; - EX unsigned bucketer(const shiftpoint& T) { + EX buckethash_t bucketer(const shiftpoint& T) { if(cgi.emb->is_euc_in_sl2()) { auto T1 = T; optimize_shift(T1); - return bucketer(T1.h) + unsigned(floor(T1.shift*81527+.5)); + return hashmix_to(bucketer(T1.h), hr::bucketer(T1.shift)); } - return bucketer(T.h) + unsigned(floor(T.shift*81527+.5)); + return hashmix_to(bucketer(T.h), hr::bucketer(T.shift)); } EX set visited; @@ -3287,10 +3287,10 @@ EX namespace dq { drawqueue.emplace(h, T); } - EX set visited_by_matrix; + EX set visited_by_matrix; EX void enqueue_by_matrix(heptagon *h, const shiftmatrix& T) { if(!h) return; - unsigned b = bucketer(T * tile_center()); + buckethash_t b = bucketer(T * tile_center()); if(visited_by_matrix.count(b)) { return; } visited_by_matrix.insert(b); drawqueue.emplace(h, T); @@ -3307,7 +3307,7 @@ EX namespace dq { EX void enqueue_by_matrix_c(cell *c, const shiftmatrix& T) { if(!c) return; - unsigned b = bucketer(T * tile_center()); + buckethash_t b = bucketer(T * tile_center()); if(visited_by_matrix.count(b)) { return; } visited_by_matrix.insert(b); drawqueue_c.emplace(c, T);