00001 #include "niml_private.h"
00002 #include <math.h>
00003
00004
00005
00006
00007
00008 static int numparam[] = { 0,0,3,1,2,0,1,2,2,2,
00009 1,2,3,2,2,2,2,2,3,1,
00010 2,2,0,0,0,
00011 -1 } ;
00012
00013 static char *distname[] = {
00014 "none" , "none" , "Correl" , "Ttest" , "Ftest" ,
00015 "Zscore" , "Chisq" , "Beta" , "Binom" , "Gamma" ,
00016 "Poisson" , "Normal" , "Ftest_nonc" , "Chisq_nonc" , "Logistic" ,
00017 "Laplace" , "Uniform" , "Ttest_nonc" , "Weibull" , "Chi" ,
00018 "Invgauss" , "Extval" , "Pval" , "LogPval" , "Log10Pval",
00019 NULL } ;
00020
00021
00022
00023 int NI_stat_numparam( int scode )
00024 {
00025 return numparam[(scode >=0 && scode <= NI_STAT_LASTCODE) ? scode : 0] ;
00026 }
00027
00028
00029
00030 char * NI_stat_distname( int scode )
00031 {
00032 return distname[(scode >=0 && scode <= NI_STAT_LASTCODE) ? scode : 0] ;
00033 }
00034
00035
00036
00037 static void NI_fval_to_char( float qval , char *buf )
00038 {
00039 float aval = fabs(qval) ;
00040 int lv , il ;
00041 char lbuf[32] ;
00042
00043
00044
00045 if( qval == 0.0 ){ strcpy(buf,"0"); return; }
00046
00047 lv = (fabs(qval) < 99999999.0) ? (int)qval : 100000001 ;
00048
00049 if( qval == lv && abs(lv) < 100000000 ){ sprintf(buf,"%d",lv); return; }
00050
00051
00052
00053 #undef BSTRIP
00054 #define BSTRIP for( il=strlen(lbuf)-1 ; \
00055 il>1 && (lbuf[il]=='0' || lbuf[il]==' ') ; \
00056 il-- ) lbuf[il] = '\0'
00057
00058
00059
00060 lv = (int) (10.0001 + log10(aval)) ;
00061
00062 switch( lv ){
00063
00064 default:
00065 if( qval > 0.0 ) sprintf( lbuf , "%-12.6e" , qval ) ;
00066 else sprintf( lbuf , "%-12.5e" , qval ) ;
00067 break ;
00068
00069 case 6:
00070 case 7:
00071 case 8:
00072 case 9:
00073 case 10:
00074 sprintf( lbuf , "%-9.6f" , qval ) ; BSTRIP ; break ;
00075
00076 case 11:
00077 sprintf( lbuf , "%-9.5f" , qval ) ; BSTRIP ; break ;
00078
00079 case 12:
00080 sprintf( lbuf , "%-9.4f" , qval ) ; BSTRIP ; break ;
00081
00082 case 13:
00083 sprintf( lbuf , "%-9.3f" , qval ) ; BSTRIP ; break ;
00084
00085 case 14:
00086 sprintf( lbuf , "%-9.2f" , qval ) ; BSTRIP ; break ;
00087
00088 case 15:
00089 sprintf( lbuf , "%-9.1f" , qval ) ; BSTRIP ; break ;
00090
00091 case 16:
00092 sprintf( lbuf , "%-9.0f" , qval ) ; break ;
00093 }
00094
00095 strcpy(buf,lbuf) ; return ;
00096 }
00097
00098
00099
00100
00101 char * NI_stat_encode( int scode , float p1, float p2, float p3 )
00102 {
00103 char *buf , *nam , b1[16] , b2[16] , b3[16] ;
00104 int np ;
00105
00106 if( scode < NI_STAT_FIRSTCODE || scode > NI_STAT_LASTCODE ){
00107 buf = strdup("none") ; return buf ;
00108 }
00109
00110 np = NI_stat_numparam( scode ) ;
00111 nam = distname[scode] ;
00112 buf = malloc( 20*(np+1) ) ;
00113 switch( np ){
00114 case 0:
00115 sprintf(buf,"%s()",nam) ; break ;
00116
00117 case 1:
00118 NI_fval_to_char( p1 , b1 ) ;
00119 sprintf(buf,"%s(%s)",nam,b1) ; break ;
00120
00121 case 2:
00122 NI_fval_to_char( p1 , b1 ) ;
00123 NI_fval_to_char( p2 , b2 ) ;
00124 sprintf(buf,"%s(%s,%s)",nam,b1,b2) ; break ;
00125
00126 default:
00127 case 3:
00128 NI_fval_to_char( p1 , b1 ) ;
00129 NI_fval_to_char( p2 , b2 ) ;
00130 NI_fval_to_char( p3 , b3 ) ;
00131 sprintf(buf,"%s(%s,%s,%s)",nam,b1,b2,b3) ; break ;
00132 }
00133
00134 return buf ;
00135 }
00136
00137
00138
00139
00140
00141 void NI_stat_decode( char *str, int *scode, float *p1, float *p2 , float *p3 )
00142 {
00143 int jj , ll ;
00144 char *dnam , qnam[64] ;
00145
00146 if( scode == NULL ) return ;
00147 *scode = 0 ;
00148 if( str == NULL || *str == '\0' ) return ;
00149
00150
00151
00152 for( jj=NI_STAT_FIRSTCODE ; jj <= NI_STAT_LASTCODE ; jj++ ){
00153 dnam = NI_stat_distname(jj) ;
00154 strcpy(qnam,dnam); strcat(qnam,"("); ll = strlen(qnam);
00155 if( strncasecmp(str,qnam,ll) == 0 ) break ;
00156 }
00157 if( jj <= NI_STAT_LASTCODE ){
00158 float parm[3]={1.0f,1.0f,1.0f} ; int np,kk,mm , sp ;
00159 np = NI_stat_numparam(jj) ; sp = ll ;
00160 for( kk=0 ; kk < np ; kk++ ){
00161 mm = 0 ; sscanf(str+sp,"%f%n",parm+kk,&mm) ; sp += mm+1 ;
00162 }
00163 *scode = jj ;
00164 if( p1 != NULL ) *p1 = parm[0] ;
00165 if( p2 != NULL ) *p2 = parm[1] ;
00166 if( p3 != NULL ) *p3 = parm[2] ;
00167 }
00168 return ;
00169 }