blob: dbd76cd09f91f20ce5706a2ad674a804eab554bd [file] [log] [blame]
/*
Copyright (C) 1997,1998,1999,2000,2001 Franz Josef Och
mkcls - a program for making word classes .
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.
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.
*/
#include "StatVar.h"
#include <iostream>
#include <stdlib.h>
double compareStatVarQuantil=-1;
StatV::~StatV() {}
int doublecompare(const void *p,const void *j)
{
if( *(double *)p == *(double *)j)
return 0;
if( *(double *)p- *(double *)j<0 )
return -1;
else
return 1;
}
int compareStatVar(const void *p,const void *j)
{
double a;
double b;
if(compareStatVarQuantil>=0)
{
a=((StatVar *)p)->quantil(compareStatVarQuantil);
b=((StatVar *)j)->quantil(compareStatVarQuantil);
}
else
{
a=((StatVar *)p)->getMean();
b=((StatVar *)j)->getMean();
}
if(a==b)
return 0;
if(a<b)
return -1;
else
return +1;
}
double StatVar::getSigmaSmaller()
{
double ss=0;
int ns=0;
for(int i=0;i<n;i++)
{
if( values[i]<getMean() )
{
ss+=(values[i]-getMean())*(values[i]-getMean());
ns++;
}
}
if( ss/ns>0 )
return sqrt(ss/ns);
else
return 0;
}
double StatVar::getSigmaBigger()
{
double ss=0;
int ns=0;
for(int i=0;i<n;i++)
if( values[i]>getMean() )
{
ss+=(values[i]-getMean())*(values[i]-getMean());
ns++;
}
if( ss/ns>0 )
return sqrt(ss/ns);
else
return 0;
}
void StatV::dumpOn(ostream &strm)
{
strm << "MEAN: " << getMean() << " (" << smallest << "-" << biggest
<< ") SIGMA:" << getSigma()<< " ";
}
double StatVar::quantil(double percent)
{
int index=(int)(n*percent);
if(index==n)
index=n-1;
assert(index>=0&&index<n);
if(sortedFlag==0)
{
qsort(values.getPointerToData(),n,sizeof(double),doublecompare);
assert(n<=values.size());
sortedFlag=1;
}
if(index<0)
{
cerr << "WARNING: StatVar.cc\n";
return 0.0;
}
else
return values[index];
}
void StatVar::printValues(ostream &strm)
{
qsort(values.getPointerToData(),n,sizeof(double),doublecompare);
assert(n<=values.size());
for(int i=0;i<n;i++)
strm << i/(double)n << " " << values[i] << endl;
return;
}