X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fnp.c;h=d297168c5967110f050f7a04de850e3438d4d2d8;hb=a03c3e402280d7aff95aeb19398a9207807507c9;hp=e61bf58e117aaf915d596bc26b8875152f0f0deb;hpb=b5c82cc9aabe7e641011130240ae1b2e84348e23;p=pspp diff --git a/src/math/np.c b/src/math/np.c index e61bf58e11..d297168c59 100644 --- a/src/math/np.c +++ b/src/math/np.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 2008, 2009, 2011 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 @@ -15,37 +15,37 @@ along with this program. If not, see . */ #include -#include "np.h" + +#include "math/np.h" #include #include #include -#include -#include -#include -#include -#include +#include "data/case.h" +#include "data/casewriter.h" +#include "libpspp/cast.h" +#include "libpspp/compiler.h" +#include "libpspp/misc.h" +#include "math/moments.h" -#include "xalloc.h" +#include "gl/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); } - 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 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 )); + double ns = gsl_cdf_ugaussian_Pinv (rank / (np->n + 1)); double z = (y - np->mean) / np->stddev; @@ -60,43 +60,53 @@ acc (struct statistic *s, const struct ccase *cx UNUSED, maximize (&np->y_max, y); minimize (&np->y_min, y); - 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; + struct ccase *cp = case_create (casewriter_get_proto (np->writer)); + *case_num_rw_idx (cp, NP_IDX_Y) = y; + *case_num_rw_idx (cp, NP_IDX_NS) = ns; + *case_num_rw_idx (cp, NP_IDX_DNS) = dns; casewriter_write (np->writer, cp); np->prev_cc = cc; } -struct order_stats * -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 caseproto *proto; - int i; - - np->prev_cc = 0; +/* Creates and returns a data structure whose accumulated results can be used + to produce a normal probability plot. The caller must supply the weighted + sample size N and the mean MEAN and variance VAR of the distribution, then + feed in the data with order_stats_accumulate() or + order_stats_accumulate_idx(). - moments1_calculate (m, &np->n, &np->mean, &variance, NULL, NULL); + There is no function to produce the results, which appear in "struct np" for + passing directly to np_plot_create() or dnp_plot_create(). - np->stddev = sqrt (variance); - - np->y_min = np->ns_min = np->dns_min = DBL_MAX; - np->y_max = np->ns_max = np->dns_max = -DBL_MAX; - - proto = caseproto_create (); - for (i = 0; i < n_NP_IDX; i++) + The caller must eventually destroy the returned structure, with + statistic_destroy(). */ +struct np * +np_create (double n, double mean, double var) +{ + struct caseproto *proto = caseproto_create (); + for (size_t i = 0; i < n_NP_IDX; i++) proto = caseproto_add_width (proto, 0); - np->writer = autopaging_writer_create (proto); + struct casewriter *writer = autopaging_writer_create (proto); caseproto_unref (proto); - os->k = 0; - stat->destroy = destroy; - stat->accumulate = acc; - - return os; + struct np *np = xmalloc (sizeof *np); + *np = (struct np) { + .parent = { + .parent = { + .destroy = destroy, + }, + .accumulate = acc, + }, + .n = n, + .mean = mean, + .stddev = sqrt (var), + .ns_min = DBL_MAX, + .ns_max = -DBL_MAX, + .dns_min = DBL_MAX, + .dns_max = -DBL_MAX, + .y_min = DBL_MAX, + .y_max = -DBL_MAX, + .writer = writer, + }; + return np; }