Categoricals: Sort the reverse value map. 20100825040502/pspp 20100826040503/pspp 20100827040503/pspp 20100828040502/pspp
authorJohn Darrington <john@darrington.wattle.id.au>
Tue, 24 Aug 2010 14:17:17 +0000 (16:17 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Tue, 24 Aug 2010 14:37:20 +0000 (16:37 +0200)
The /CONTRAST subcommand of the ONEWAY command
requires that the categorical values are sorted
in ascending order.

src/math/categoricals.c
tests/language/stats/oneway.at

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);
 }
 
 
index 5b4a64734aabe614a8de3ef0708d7bc20edcca1b..47df1883925b90acec1c3e94eb0772359bdb8ae6 100644 (file)
@@ -4,19 +4,19 @@ AT_SETUP([ONEWAY basic operation])
 AT_DATA([oneway.sps],
   [DATA LIST NOTABLE LIST /QUALITY * BRAND * .
 BEGIN DATA
+7  3
+4  3
 3 1
 2 1
 1 1
-1 1
-4 1
-5 2
-2 2
 4 2
 2 2
 3 2
-7  3
-4  3
 5  3
+1 1
+4 1
+5 2
+2 2
 3  3
 6  3
 END DATA