From cbab34f8cd28876f9b1d67d2ad10b312181bf2f6 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sat, 29 Jan 2022 12:01:16 -0800 Subject: [PATCH] math: Coding style updates in some order-stat implementations. I generally find structure assignments clearer than individual assignments to each of their members these days. --- src/math/box-whisker.c | 38 +++++++++++++++----------------- src/math/np.c | 49 +++++++++++++++++++---------------------- src/math/np.h | 3 +-- src/math/trimmed-mean.c | 34 ++++++++++++++-------------- 4 files changed, 58 insertions(+), 66 deletions(-) diff --git a/src/math/box-whisker.c b/src/math/box-whisker.c index 506251682c..86277333ff 100644 --- a/src/math/box-whisker.c +++ b/src/math/box-whisker.c @@ -144,26 +144,24 @@ struct box_whisker * box_whisker_create (const struct tukey_hinges *th, size_t id_idx, const struct variable *id_var) { - struct box_whisker *w = XZALLOC (struct box_whisker); - struct order_stats *os = &w->parent; - struct statistic *stat = &os->parent; - - os->n_k = 0; - - stat->destroy = destroy; - stat->accumulate = acc; - - tukey_hinges_calculate (th, w->hinges); - - w->id_idx = id_idx; - w->id_var = id_var; - - w->step = (w->hinges[2] - w->hinges[0]) * 1.5; - - w->whiskers[1] = w->hinges[2]; - w->whiskers[0] = SYSMIS; - - ll_init (&w->outliers); + double hinges[3]; + tukey_hinges_calculate (th, hinges); + + struct box_whisker *w = xmalloc (sizeof *w); + *w = (struct box_whisker) { + .parent = { + .parent = { + .accumulate = acc, + .destroy = destroy, + }, + }, + .hinges = { hinges[0], hinges[1], hinges[2] }, + .whiskers = { SYSMIS, hinges[2] }, + .outliers = LL_INITIALIZER (w->outliers), + .step = (hinges[2] - hinges[0]) * 1.5, + .id_idx = id_idx, + .id_var = id_var, + }; return w; } diff --git a/src/math/np.c b/src/math/np.c index 220865ba3c..dd21b1f362 100644 --- a/src/math/np.c +++ b/src/math/np.c @@ -38,12 +38,10 @@ destroy (struct statistic *stat) 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 = UP_CAST (s, struct np, parent.parent); double rank = np->prev_cc + (c + 1) / 2.0; @@ -62,7 +60,7 @@ 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)); + 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; @@ -85,31 +83,30 @@ acc (struct statistic *s, const struct ccase *cx UNUSED, struct np * np_create (double n, double mean, double var) { - struct np *np = XZALLOC (struct np); - struct order_stats *os = &np->parent; - struct statistic *stat = &os->parent; - struct caseproto *proto; - int i; - - np->prev_cc = 0; - - np->n = n; - np->mean = mean; - - np->stddev = sqrt (var); - - 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++) + 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; - + struct np *np = xmalloc (sizeof *np); + *np = (struct np) { + .parent = { + .parent = { + .accumulate = acc, + .destroy = destroy, + }, + }, + .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; } diff --git a/src/math/np.h b/src/math/np.h index 998bee089e..4bd86e526f 100644 --- a/src/math/np.h +++ b/src/math/np.h @@ -53,7 +53,6 @@ struct np struct casewriter *writer; }; - -struct np * np_create (double n, double mean, double var); +struct np *np_create (double n, double mean, double var); #endif diff --git a/src/math/trimmed-mean.c b/src/math/trimmed-mean.c index 4840fd2d66..d44131a53b 100644 --- a/src/math/trimmed-mean.c +++ b/src/math/trimmed-mean.c @@ -50,30 +50,28 @@ destroy (struct statistic *s) struct trimmed_mean * trimmed_mean_create (double W, double tail) { - struct trimmed_mean *tm = XZALLOC (struct trimmed_mean); - struct order_stats *os = &tm->parent; - struct statistic *stat = &os->parent; - - os->n_k = 2; - os->k = tm->k; - assert (tail >= 0); assert (tail <= 1); - os->k[0].tc = tail * W; - os->k[1].tc = W * (1 - tail); - - stat->accumulate = acc; - stat->destroy = destroy; - - tm->cyk1p1 = SYSMIS; - tm->w = W; - tm->tail = tail; - + struct trimmed_mean *tm = xmalloc (sizeof *tm); + *tm = (struct trimmed_mean) { + .parent = { + .parent = { + .accumulate = acc, + .destroy = destroy, + }, + .k = tm->k, + .n_k = 2, + }, + .k[0] = { .tc = tail * W }, + .k[1] = { .tc = W * (1 - tail) }, + .cyk1p1 = SYSMIS, + .w = W, + .tail = tail, + }; return tm; } - double trimmed_mean_calculate (const struct trimmed_mean *tm) { -- 2.30.2