X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fpercentiles.c;h=aa7eead6c03980d9b1dc2bafca96777341678351;hb=0bd0098aec2ee31d9460c8d4c1263d0b5ccc4324;hp=7fec4ce9d5e36871232654ad5e56d04847b351ff;hpb=5d9d2b2ae7d49240f3438e4f3c40ac1f276e31fb;p=pspp-builds.git diff --git a/src/math/percentiles.c b/src/math/percentiles.c index 7fec4ce9..aa7eead6 100644 --- a/src/math/percentiles.c +++ b/src/math/percentiles.c @@ -1,36 +1,33 @@ -/* PSPP - A program for statistical analysis . -*-c-*- +/* PSPP - a program for statistical analysis. + Copyright (C) 2004 Free Software Foundation, Inc. -Copyright (C) 2004 Free Software Foundation, Inc. -Author: John Darrington 2004 + 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. -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 the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301, USA. */ + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include +#include +#include #include #include "factor-stats.h" #include "percentiles.h" #include +#include "minmax.h" + #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid -#include - - struct ptile_params { double g1, g1_star; @@ -54,27 +51,27 @@ const char *const ptile_alg_desc[] = { /* Individual Percentile algorithms */ /* Closest observation to tc1 */ -double ptile_round(const struct weighted_value **wv, +double ptile_round(const struct weighted_value **wv, const struct ptile_params *par); /* Weighted average at y_tc2 */ -double ptile_haverage(const struct weighted_value **wv, +double ptile_haverage(const struct weighted_value **wv, const struct ptile_params *par); /* Weighted average at y_tc1 */ -double ptile_waverage(const struct weighted_value **wv, +double ptile_waverage(const struct weighted_value **wv, const struct ptile_params *par); /* Empirical distribution function */ -double ptile_empirical(const struct weighted_value **wv, +double ptile_empirical(const struct weighted_value **wv, const struct ptile_params *par); /* Empirical distribution function with averaging*/ -double ptile_aempirical(const struct weighted_value **wv, +double ptile_aempirical(const struct weighted_value **wv, const struct ptile_params *par); @@ -82,25 +79,25 @@ double ptile_aempirical(const struct weighted_value **wv, /* Closest observation to tc1 */ double -ptile_round(const struct weighted_value **wv, +ptile_round(const struct weighted_value **wv, const struct ptile_params *par) { double x; double a=0; - if ( par->k1 >= 0 ) + if ( par->k1 >= 0 ) a = wv[par->k1]->v.f; if ( wv[par->k1 + 1]->w >= 1 ) { - if ( par->g1_star < 0.5 ) + if ( par->g1_star < 0.5 ) x = a; else x = wv[par->k1 + 1]->v.f; } else { - if ( par->g1 < 0.5 ) + if ( par->g1 < 0.5 ) x = a; else x = wv[par->k1 + 1]->v.f; @@ -112,35 +109,35 @@ ptile_round(const struct weighted_value **wv, /* Weighted average at y_tc2 */ double -ptile_haverage(const struct weighted_value **wv, +ptile_haverage(const struct weighted_value **wv, const struct ptile_params *par) { double a=0; - if ( par->g2_star >= 1.0 ) + if ( par->g2_star >= 1.0 ) return wv[par->k2 + 1]->v.f ; - /* Special case for k2 + 1 >= n_data + /* Special case for k2 + 1 >= n_data (actually it's not a special case, but just avoids indexing errors ) */ - if ( par->g2_star == 0 ) + if ( par->g2_star == 0 ) { assert(par->g2 == 0 ); return wv[par->k2]->v.f; } /* Ditto for k2 < 0 */ - if ( par->k2 >= 0 ) + if ( par->k2 >= 0 ) { a = wv[par->k2]->v.f; } - if ( wv[par->k2 + 1]->w >= 1.0 ) - return ( (1 - par->g2_star) * a + + if ( wv[par->k2 + 1]->w >= 1.0 ) + return ( (1 - par->g2_star) * a + par->g2_star * wv[par->k2 + 1]->v.f); else - return ( (1 - par->g2) * a + + return ( (1 - par->g2) * a + par->g2 * wv[par->k2 + 1]->v.f); } @@ -148,35 +145,35 @@ ptile_haverage(const struct weighted_value **wv, /* Weighted average at y_tc1 */ -double -ptile_waverage(const struct weighted_value **wv, +double +ptile_waverage(const struct weighted_value **wv, const struct ptile_params *par) { double a=0; - if ( par->g1_star >= 1.0 ) + if ( par->g1_star >= 1.0 ) return wv[par->k1 + 1]->v.f ; - if ( par->k1 >= 0 ) + if ( par->k1 >= 0 ) { a = wv[par->k1]->v.f; } - if ( wv[par->k1 + 1]->w >= 1.0 ) - return ( (1 - par->g1_star) * a + + if ( wv[par->k1 + 1]->w >= 1.0 ) + return ( (1 - par->g1_star) * a + par->g1_star * wv[par->k1 + 1]->v.f); else - return ( (1 - par->g1) * a + + return ( (1 - par->g1) * a + par->g1 * wv[par->k1 + 1]->v.f); } /* Empirical distribution function */ -double -ptile_empirical(const struct weighted_value **wv, +double +ptile_empirical(const struct weighted_value **wv, const struct ptile_params *par) { - if ( par->g1_star > 0 ) + if ( par->g1_star > 0 ) return wv[par->k1 + 1]->v.f; else return wv[par->k1]->v.f; @@ -185,11 +182,11 @@ ptile_empirical(const struct weighted_value **wv, /* Empirical distribution function with averageing */ -double -ptile_aempirical(const struct weighted_value **wv, +double +ptile_aempirical(const struct weighted_value **wv, const struct ptile_params *par) { - if ( par->g1_star > 0 ) + if ( par->g1_star > 0 ) return wv[par->k1 + 1]->v.f; else return (wv[par->k1]->v.f + wv[par->k1 + 1]->v.f ) / 2.0 ; @@ -198,7 +195,7 @@ ptile_aempirical(const struct weighted_value **wv, /* Compute the percentile p */ -double ptile(double p, +double ptile(double p, const struct weighted_value **wv, int n_data, double w, @@ -206,8 +203,8 @@ double ptile(double p, -double -ptile(double p, +double +ptile(double p, const struct weighted_value **wv, int n_data, double w, @@ -227,21 +224,21 @@ ptile(double p, pp.k1 = -1; pp.k2 = -1; - for ( i = 0 ; i < n_data ; ++i ) + for ( i = 0 ; i < n_data ; ++i ) { - if ( wv[i]->cc <= tc1 ) + if ( wv[i]->cc <= tc1 ) pp.k1 = i; - if ( wv[i]->cc <= tc2 ) + if ( wv[i]->cc <= tc2 ) pp.k2 = i; - + } - if ( pp.k1 >= 0 ) + if ( pp.k1 >= 0 ) { pp.g1 = ( tc1 - wv[pp.k1]->cc ) / wv[pp.k1 + 1]->w; - pp.g1_star = tc1 - wv[pp.k1]->cc ; + pp.g1_star = tc1 - wv[pp.k1]->cc ; } else { @@ -250,17 +247,17 @@ ptile(double p, } - if ( pp.k2 + 1 >= n_data ) + if ( pp.k2 + 1 >= n_data ) { pp.g2 = 0 ; pp.g2_star = 0; } - else + else { - if ( pp.k2 >= 0 ) + if ( pp.k2 >= 0 ) { pp.g2 = ( tc2 - wv[pp.k2]->cc ) / wv[pp.k2 + 1]->w; - pp.g2_star = tc2 - wv[pp.k2]->cc ; + pp.g2_star = tc2 - wv[pp.k2]->cc ; } else { @@ -269,7 +266,7 @@ ptile(double p, } } - switch ( algorithm ) + switch ( algorithm ) { case PC_HAVERAGE: result = ptile_haverage(wv, &pp); @@ -294,11 +291,11 @@ ptile(double p, } -/* +/* Calculate the values of the percentiles in pc_hash. wv is a sorted array of weighted values of the data set. */ -void +void ptiles(struct hsh_table *pc_hash, const struct weighted_value **wv, int n_data, @@ -308,7 +305,7 @@ ptiles(struct hsh_table *pc_hash, struct hsh_iterator hi; struct percentile *p; - if ( !pc_hash ) + if ( !pc_hash ) return ; for ( p = hsh_first(pc_hash, &hi); p != 0 ; @@ -316,14 +313,14 @@ ptiles(struct hsh_table *pc_hash, { p->v = ptile(p->p/100.0 , wv, n_data, w, algorithm); } - + } /* Calculate Tukey's Hinges */ void tukey_hinges(const struct weighted_value **wv, - int n_data, + int n_data, double w, double hinge[3] ) @@ -334,10 +331,10 @@ tukey_hinges(const struct weighted_value **wv, double l[3]; int h[3]; double a, a_star; - - for ( i = 0 ; i < n_data ; ++i ) + + for ( i = 0 ; i < n_data ; ++i ) { - c_star = min(c_star, wv[i]->w); + c_star = MIN(c_star, wv[i]->w); } if ( c_star > 1 ) c_star = 1; @@ -352,7 +349,7 @@ tukey_hinges(const struct weighted_value **wv, h[1]=-1; h[2]=-1; - for ( i = 0 ; i < n_data ; ++i ) + for ( i = 0 ; i < n_data ; ++i ) { if ( l[0] >= wv[i]->cc ) h[0] = i ; if ( l[1] >= wv[i]->cc ) h[1] = i ; @@ -362,7 +359,7 @@ tukey_hinges(const struct weighted_value **wv, for ( i = 0 ; i < 3 ; i++ ) { - if ( h[i] >= 0 ) + if ( h[i] >= 0 ) a_star = l[i] - wv[h[i]]->cc ; else a_star = l[i]; @@ -373,12 +370,12 @@ tukey_hinges(const struct weighted_value **wv, hinge[i] = (1 - a_star) * wv[h[i]]->v.f; continue; } - else + else { - a = a_star / ( wv[h[i] + 1]->cc ) ; + a = a_star / ( wv[h[i] + 1]->cc ) ; } - if ( a_star >= 1.0 ) + if ( a_star >= 1.0 ) { hinge[i] = wv[h[i] + 1]->v.f ; continue; @@ -393,7 +390,7 @@ tukey_hinges(const struct weighted_value **wv, } hinge[i] = (1 - a) * wv[h[i]]->v.f + a * wv[h[i] + 1]->v.f; - + } assert(hinge[0] <= hinge[1]); @@ -403,18 +400,18 @@ tukey_hinges(const struct weighted_value **wv, int -ptile_compare(const struct percentile *p1, - const struct percentile *p2, +ptile_compare(const struct percentile *p1, + const struct percentile *p2, void *aux UNUSED) { int cmp; - - if ( p1->p == p2->p) + + if ( p1->p == p2->p) cmp = 0 ; else if (p1->p < p2->p) - cmp = -1 ; - else + cmp = -1 ; + else cmp = +1; return cmp;