Categoricals: Sort the reverse value map.
[pspp] / src / math / categoricals.c
index 576e19b1d322be30f2ee878aeda65e33083347d2..c8b337e452012f03c2d16f5229f2253441a16b21 100644 (file)
@@ -26,6 +26,7 @@
 #include <data/value.h>
 #include <libpspp/hmap.h>
 #include <libpspp/pool.h>
+#include <libpspp/array.h>
 
 #include <libpspp/str.h>
 
@@ -41,7 +42,6 @@ struct value_node
                                 Can be used as an index into an array */
 };
 
-
 struct var_params
 {
   /* A map indexed by a union values */
@@ -62,6 +62,18 @@ struct var_params
 };
 
 
+/* Comparison function to sort the reverse_value_map in ascending order */
+static int
+compare_value_node (const void *vn1_, const void *vn2_, const void *aux)
+{
+  const struct value_node * const *vn1 = vn1_;
+  const struct value_node * const *vn2 = vn2_;
+  const struct var_params *vp = aux;
+
+  return value_compare_3way (&(*vn1)->value, &(*vn2)->value, var_get_width (vp->var));
+}
+
+
 struct categoricals
 {
   /* The weight variable */
@@ -115,7 +127,7 @@ categoricals_destroy ( struct categoricals *cat)
 }
 
 
-#if 1
+#if 0
 void
 categoricals_dump (const struct categoricals *cat)
 {
@@ -330,6 +342,10 @@ categoricals_done (struct categoricals *cat)
          vp->reverse_value_map[vn->subscript] = vn;
        }
 
+      /* For some purposes (eg CONTRASTS in ONEWAY) the values need to be sorted */
+      sort (vp->reverse_value_map, vp->n_cats, sizeof (const struct value_node *),
+           compare_value_node, vp);
+
       /* Populate the reverse variable map.
        */
       for (i = 0; i < vp->n_cats; ++i)
@@ -338,7 +354,6 @@ categoricals_done (struct categoricals *cat)
 
   assert (cat->n_vars <= cat->n_vp);
 
-  //  categoricals_dump (cat);
 }