]> mj.ucw.cz Git - libucw.git/blobdiff - images/hilbert-test.c
rest of bbuf printf
[libucw.git] / images / hilbert-test.c
index 235c3ae4ebf1fe8814bbd8470a6c00b5ed594cf4..9824f092600da500a8c7328773ed683c620f1311 100644 (file)
@@ -3,14 +3,79 @@
 #define LOCAL_DEBUG
 
 #include "lib/lib.h"
 #define LOCAL_DEBUG
 
 #include "lib/lib.h"
-
+#include "lib/mempool.h"
+#include "lib/math.h"
 #include <stdlib.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_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"
 #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];
 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 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);
           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)
 {
 int
 main(int argc UNUSED, char **argv UNUSED)
 {
+  pool = mp_new(1 << 16);
   test1();
   //test_origin();
   return 0;
   test1();
   //test_origin();
   return 0;