X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ffactor_stats.c;h=4508caf889c3c4eceed0756a048089ddb688043c;hb=6a42f0b711d699333fda01a076b8a27275fc4492;hp=7c4cce000f928c63c7931469dab9396091d9d064;hpb=46cc6dd316280579f5b03dfd39d01bc7daf88df7;p=pspp diff --git a/src/factor_stats.c b/src/factor_stats.c index 7c4cce000f..4508caf889 100644 --- a/src/factor_stats.c +++ b/src/factor_stats.c @@ -15,8 +15,8 @@ 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., 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301, USA. */ #include "factor_stats.h" #include "config.h" @@ -44,6 +44,7 @@ metrics_precalc(struct metrics *m) m->min = DBL_MAX; m->max = -DBL_MAX; + m->histogram = 0; m->moments = moments1_create(MOMENT_KURTOSIS); @@ -124,7 +125,6 @@ metrics_postcalc(struct metrics *m) int i; int j = 1; - moments1_calculate (m->moments, &m->n, &m->mean, &m->var, &m->skewness, &m->kurtosis); @@ -142,6 +142,13 @@ metrics_postcalc(struct metrics *m) m->wvp = (struct weighted_value **) hsh_sort(m->ordered_data); m->n_data = hsh_count(m->ordered_data); + /* Trimmed mean calculation */ + if ( m->n_data <= 1 ) + { + m->trimmed_mean = m->mean; + return; + } + m->histogram = histogram_create(10, m->min, m->max); for ( i = 0 ; i < m->n_data ; ++i ) @@ -150,13 +157,6 @@ metrics_postcalc(struct metrics *m) gsl_histogram_accumulate(m->histogram, wv[i]->v.f, wv[i]->w); } - /* Trimmed mean calculation */ - if ( m->n_data <= 1 ) - { - m->trimmed_mean = m->mean; - return; - } - tc = m->n * 0.05 ; k1 = -1; k2 = -1; @@ -207,6 +207,7 @@ metrics_postcalc(struct metrics *m) m->trimmed_mean += (m->wvp[k1 + 1]->cc - tc) * m->wvp[k1 + 1]->v.f ; m->trimmed_mean /= 0.9 * m->n ; + } @@ -225,7 +226,12 @@ weighted_value_create(void) void weighted_value_free(struct weighted_value *wv) { - struct case_node *cn = wv->case_nos; + struct case_node *cn ; + + if ( !wv ) + return ; + + cn = wv->case_nos; while(cn) { @@ -255,16 +261,29 @@ create_factor_statistics (int n, union value *id0, union value *id1) f->id[0] = *id0; f->id[1] = *id1; f->m = xmalloc( sizeof ( struct metrics ) * n ) ; + memset (f->m, 0, sizeof(struct metrics) * n); + f->n_var = n; return f; } +void +metrics_destroy(struct metrics *m) +{ + hsh_destroy(m->ordered_data); + hsh_destroy(m->ptile_hash); + if ( m-> histogram ) + gsl_histogram_free(m->histogram); +} + void factor_statistics_free(struct factor_statistics *f) { - hsh_destroy(f->m->ordered_data); - gsl_histogram_free(f->m->histogram); + + int i; + for ( i = 0 ; i < f->n_var; ++i ) + metrics_destroy(&f->m[i]); free(f->m) ; free(f); }