43e89fc5b161e3e665b806053a08e41d5d8f5fab
kent
  Wed Aug 27 14:22:29 2014 -0700
Adding a little test program.
diff --git src/oneShot/hacTreeTest/hacTreeTest.c src/oneShot/hacTreeTest/hacTreeTest.c
new file mode 100644
index 0000000..942445e
--- /dev/null
+++ src/oneShot/hacTreeTest/hacTreeTest.c
@@ -0,0 +1,118 @@
+/* hacTreeTest - Test out various hacTree code. */
+
+#include "common.h"
+#include "linefile.h"
+#include "hash.h"
+#include "options.h"
+#include "hacTree.h"
+#include "pthreadDoList.h"
+
+char* clHacTree = "fromItems";
+int clThreads = 10;
+
+void usage()
+/* Explain usage and exit. */
+{
+errAbort(
+  "hacTreeTest - Test out various hacTree code\n"
+  "usage:\n"
+  "   hacTreeTest XXX\n"
+  "options:\n"
+  "   -hacTree = Dictates how the tree is generated;  multiThreads or costlyMerges or fromItems. fromItems is default \n"
+  "   -threads - number of threads to use for multiThread default %d\n"
+  , clThreads
+  );
+}
+
+/* Command line validation table. */
+static struct optionSpec options[] = {
+   {"threads", OPTION_INT},
+   {"hacTree", OPTION_STRING},
+   {NULL, 0},
+};
+
+void rDump(struct hacTree *ht, int level, FILE *f)
+/* Help dump out results */
+{
+spaceOut(f, level*2);
+struct slDouble *el = (struct slDouble *)ht->itemOrCluster;
+if (ht->left || ht->right)
+    {
+    fprintf(f, "(%g %g)\n", el->val, ht->childDistance);
+    rDump(ht->left, level+1, f);
+    rDump(ht->right, level+1, f);
+    }
+else
+    fprintf(f, "%g\n", el->val);
+}
+
+double dblDistance(const struct slList *item1, const struct slList *item2, void *extraData)
+{
+struct slDouble *i1 = (struct slDouble *)item1;
+struct slDouble *i2 = (struct slDouble *)item2;
+double d = fabs(i1->val - i2->val);
+verbose(2, "dblDistance %g %g = %g\n", i1->val, i2->val, d);
+return d;
+}
+
+struct slList *dblMerge(const struct slList *item1, const struct slList *item2, 
+    void *extraData)
+{
+struct slDouble *i1 = (struct slDouble *)item1;
+struct slDouble *i2 = (struct slDouble *)item2;
+double d = 0.5 * (i1->val + i2->val);
+verbose(2, "dblMerge %g %g = %g\n", i1->val, i2->val, d);
+return (struct slList *)slDoubleNew(d);
+}
+
+void hacTreeTest(char *output)
+/* hacTreeTest - Test out various hacTree code. */
+{
+FILE *f = mustOpen(output, "w");
+int i;
+
+/* Make up list of random numbers */
+struct slDouble *list = NULL;
+double data[] = {1,2, 4,5,  6,7,  11,15,  22,24};
+for (i=0; i<10; ++i)
+    {
+    struct slDouble *el = slDoubleNew(data[i]);
+    slAddHead(&list, el);
+    }
+struct lm *lm = lmInit(0);
+struct hacTree *ht = NULL;
+
+if (sameString(clHacTree, "multiThreads"))
+    {
+    ht = hacTreeMultiThread(clThreads, (struct slList *)list, lm, dblDistance, dblMerge, 
+	NULL, NULL);
+    }
+else if (sameString(clHacTree, "costlyMerges"))
+    {
+    ht = hacTreeForCostlyMerges((struct slList *)list, lm, dblDistance, dblMerge, NULL);
+    }
+else if (sameString(clHacTree, "fromItems"))
+    {
+    ht = hacTreeFromItems((struct slList *)list, lm, dblDistance, dblMerge, NULL, NULL);
+    }
+else 
+    {
+    uglyAbort("Unrecognized input option: %s", clHacTree);
+    }
+rDump(ht, 0, f);
+carefulClose(&f);
+}
+
+
+
+int main(int argc, char *argv[])
+/* Process command line. */
+{
+optionInit(&argc, argv, options);
+if (argc != 2)
+    usage();
+clHacTree = optionVal("hacTree", clHacTree);
+clThreads = optionInt("threads", clThreads);
+hacTreeTest(argv[1]);
+return 0;
+}