#define LOCAL_DEBUG
#include "lib/lib.h"
-
+#include "lib/mempool.h"
+#include "lib/math.h"
#include <stdlib.h>
+#include <stdio.h>
+
+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"
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));
}
}
int
main(int argc UNUSED, char **argv UNUSED)
{
+ pool = mp_new(1 << 16);
test1();
//test_origin();
return 0;