X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fnp.c;h=b631820903e6ebf4e41a536ebe7ea964924af918;hb=cb72db62c20ecab427229110820c5b053d0663c4;hp=e189b47091faee8304ee1a557042cd0f2cff873c;hpb=c3ac5a8af9c449072c7e872ca70a78c1755ae309;p=pspp diff --git a/src/math/np.c b/src/math/np.c index e189b47091..b631820903 100644 --- a/src/math/np.c +++ b/src/math/np.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,20 +16,25 @@ #include #include "np.h" -#include -#include -#include -#include + #include -#include +#include +#include + #include #include +#include +#include +#include +#include + +#include "xalloc.h" static void destroy (struct statistic *stat) { - struct order_stats *os = (struct order_stats *) stat; - free (os); + struct np *np = UP_CAST (stat, struct np, parent.parent); + free (np); } @@ -37,8 +42,8 @@ static void acc (struct statistic *s, const struct ccase *cx UNUSED, double c, double cc, double y) { - struct ccase cp; - struct np *np = (struct np *) s; + struct ccase *cp; + struct np *np = UP_CAST (s, struct np, parent.parent); double rank = np->prev_cc + (c + 1) / 2.0; double ns = gsl_cdf_ugaussian_Pinv (rank / ( np->n + 1 )); @@ -56,24 +61,24 @@ acc (struct statistic *s, const struct ccase *cx UNUSED, maximize (&np->y_max, y); minimize (&np->y_min, y); - case_create (&cp, n_NP_IDX); - - case_data_rw_idx (&cp, NP_IDX_Y)->f = y; - case_data_rw_idx (&cp, NP_IDX_NS)->f = ns; - case_data_rw_idx (&cp, NP_IDX_DNS)->f = dns; - - casewriter_write (np->writer, &cp); + cp = case_create (casewriter_get_proto (np->writer)); + case_data_rw_idx (cp, NP_IDX_Y)->f = y; + case_data_rw_idx (cp, NP_IDX_NS)->f = ns; + case_data_rw_idx (cp, NP_IDX_DNS)->f = dns; + casewriter_write (np->writer, cp); np->prev_cc = cc; } -struct order_stats * +struct np * np_create (const struct moments1 *m) { double variance; struct np *np = xzalloc (sizeof (*np)); - struct statistic *stat = (struct statistic *) np; - struct order_stats *os = (struct order_stats *) np; + struct order_stats *os = &np->parent; + struct statistic *stat = &os->parent; + struct caseproto *proto; + int i; np->prev_cc = 0; @@ -84,11 +89,15 @@ np_create (const struct moments1 *m) np->y_min = np->ns_min = np->dns_min = DBL_MAX; np->y_max = np->ns_max = np->dns_max = -DBL_MAX; - np->writer = autopaging_writer_create (n_NP_IDX); + proto = caseproto_create (); + for (i = 0; i < n_NP_IDX; i++) + proto = caseproto_add_width (proto, 0); + np->writer = autopaging_writer_create (proto); + caseproto_unref (proto); os->k = 0; stat->destroy = destroy; stat->accumulate = acc; - return os; + return np; }