X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=inline;f=images%2Fhilbert-test.c;h=9824f092600da500a8c7328773ed683c620f1311;hb=94022b1a1e317871b302946b595b2e890f4f1853;hp=235c3ae4ebf1fe8814bbd8470a6c00b5ed594cf4;hpb=19fee44ed7e0d780267e0a049ec2eb82db00d46c;p=libucw.git diff --git a/images/hilbert-test.c b/images/hilbert-test.c index 235c3ae4..9824f092 100644 --- a/images/hilbert-test.c +++ b/images/hilbert-test.c @@ -3,14 +3,79 @@ #define LOCAL_DEBUG #include "lib/lib.h" - +#include "lib/mempool.h" +#include "lib/math.h" #include +#include + +static struct mempool *pool; + +static uns dim; +static uns order; + +static inline void +rand_vec(uns *vec) +{ + for (uns i = 0; i < dim; i++) + vec[i] = (uns)rand() >> (32 - order); +} + +static byte * +print_vec(uns *vec) +{ + byte *s = mp_alloc(pool, dim * 16), *res = s; + *s++ = '('; + for (uns i = 0; i < dim; i++) + { + if (i) + *s++ = ' '; + s += sprintf(s, "%x", vec[i]); + } + *s++ = ')'; + *s = 0; + return res; +} + +static inline int +cmp_vec(uns *vec1, uns *vec2) +{ + for (uns i = dim; i--; ) + if (vec1[i] < vec2[i]) + return -1; + else if (vec1[i] > vec2[i]) + return 1; + return 0; +} + +#if 0 +static long double +param_dist(uns *vec1, uns *vec2) +{ + long double d1 = 0, d2 = 0; + for (uns i = 0; i < dim; i++) + { + d1 = (d1 + vec1[i]) / ((u64)1 << order); + d2 = (d2 + vec2[i]) / ((u64)1 << order); + } + return fabsl(d1 - d2); +} + +static long double +vec_dist(uns *vec1, uns *vec2) +{ + long double d = 0; + for (uns i = 0; i < dim; i++) + { + long double x = fabsl(vec1[i] - vec2[i]) / ((u64)1 << order); + d += x * x; + } + return sqrtl(d); +} +#endif -static uns test1_dim; -static uns test1_order; #define HILBERT_PREFIX(x) test1_##x -#define HILBERT_DIM test1_dim -#define HILBERT_ORDER test1_order +#define HILBERT_DIM dim +#define HILBERT_ORDER order #define HILBERT_WANT_DECODE #define HILBERT_WANT_ENCODE #include "images/hilbert.h" @@ -19,17 +84,16 @@ static void test1(void) { uns a[32], b[32], c[32]; - for (test1_dim = 2; test1_dim <= 8; test1_dim++) - for (test1_order = 8; test1_order <= 32; test1_order++) + for (dim = 2; dim <= 8; dim++) + for (order = 8; order <= 32; order++) for (uns i = 0; i < 1000; i++) { - for (uns j = 0; j < test1_dim; j++) - a[j] = (uns)rand() >> (32 - test1_order); + rand_vec(a); test1_encode(b, a); test1_decode(c, b); - for (uns j = 0; j < test1_dim; j++) - if (a[j] != c[j]) - die("Error... dim=%d order=%d testnum=%d index=%d val1=0x%08x val2=0x%08x", test1_dim, test1_order, i, j, a[j], c[j]); + if (cmp_vec(a, c)) + die("Error... dim=%d order=%d testnum=%d ... %s -> %s -> %s", + dim, order, i, print_vec(a), print_vec(b), print_vec(c)); } } @@ -53,6 +117,7 @@ test_origin(void) int main(int argc UNUSED, char **argv UNUSED) { + pool = mp_new(1 << 16); test1(); //test_origin(); return 0;