Fixed a bug in the levene test, and added the levene test to the oneway cmd
[pspp] / src / vars-atr.c
index 7efc5390a6d3c4ada3b8a426139c60576060a4cc..0b6877dbf72c1012d6c2d7ffa44a5e3d654689ef 100644 (file)
 
 #include <config.h>
 #include "var.h"
-#include <assert.h>
+#include "error.h"
 #include <stdlib.h>
 #include "alloc.h"
-#include "approx.h"
 #include "command.h"
 #include "do-ifP.h"
 #include "expr.h"
@@ -46,6 +45,22 @@ compare_values (const union value *a, const union value *b, int width)
     return memcmp (a->s, b->s, width);
 }
 
+/* Create a hash of v */
+unsigned 
+hash_value(const union value  *v, int width)
+{
+  unsigned id_hash;
+
+  if ( 0 == width ) 
+    id_hash = hsh_hash_double (v->f);
+  else
+    id_hash = hsh_hash_bytes (v->s, width);
+
+  return id_hash;
+}
+
+
+
 /* Discards all the current state in preparation for a data-input
    command like DATA LIST or GET. */
 void
@@ -56,9 +71,9 @@ discard_variables (void)
 
   n_lag = 0;
   
-  if (vfm_source)
+  if (vfm_source != NULL)
     {
-      vfm_source->destroy_source ();
+      free_case_source (vfm_source);
       vfm_source = NULL;
     }
 
@@ -84,31 +99,25 @@ is_num_user_missing (double x, const struct variable *v)
     case MISSING_NONE:
       return 0;
     case MISSING_1:
-      return approx_eq (x, v->missing[0].f);
+      return x == v->missing[0].f;
     case MISSING_2:
-      return (approx_eq (x, v->missing[0].f)
-             || approx_eq (x, v->missing[1].f));
+      return x == v->missing[0].f || x == v->missing[1].f;
     case MISSING_3:
-      return (approx_eq (x, v->missing[0].f)
-             || approx_eq (x, v->missing[1].f)
-             || approx_eq (x, v->missing[2].f));
+      return (x == v->missing[0].f || x == v->missing[1].f
+              || x == v->missing[2].f);
     case MISSING_RANGE:
-      return (approx_ge (x, v->missing[0].f)
-             && approx_le (x, v->missing[1].f));
+      return x >= v->missing[0].f && x <= v->missing[1].f;
     case MISSING_LOW:
-      return approx_le (x, v->missing[0].f);
+      return x <= v->missing[0].f;
     case MISSING_HIGH:
-      return approx_ge (x, v->missing[0].f);
+      return x >= v->missing[0].f;
     case MISSING_RANGE_1:
-      return ((approx_ge (x, v->missing[0].f)
-              && approx_le (x, v->missing[1].f))
-             || approx_eq (x, v->missing[2].f));
+      return ((x >= v->missing[0].f && x <= v->missing[1].f)
+             || x == v->missing[2].f);
     case MISSING_LOW_1:
-      return (approx_le (x, v->missing[0].f)
-             || approx_eq (x, v->missing[1].f));
+      return x <= v->missing[0].f || x == v->missing[1].f;
     case MISSING_HIGH_1:
-      return (approx_ge (x, v->missing[0].f)
-             || approx_eq (x, v->missing[1].f));
+      return x >= v->missing[0].f || x == v->missing[1].f;
     default:
       assert (0);
     }