#include "my.h" #include #define LEN 20 int gen[10]; double p0, q0, n ; main() { int s1, nsites, *pos , i , j, k, *nall, count, nsam ; int a, b, count1, count2, countq ; int gc[3][3], s2 ; char ***gam ; double dmin, dmax, dprime, d, rsq; double mled(), lnli(double) ; scanf( " %d", &nsam); scanf(" %d", &nsites ); printf(" nsam: %d nsites: %d\n", nsam, nsites); pos = (int *)malloc( (nsites+1)*sizeof( int ) ) ; nall = (int *)malloc( (nsites+1)*sizeof( int ) ) ; gam = (char ***)malloc( 2*nsam*sizeof( char **) ) ; for(i=0; i< 2*nsam; i++) { gam[i] = (char **)malloc( (nsites+1)*sizeof( char *) ) ; for( j=0; j<=nsites; j++) gam[i][j] = (char *) malloc( LEN*sizeof(char) ) ; } for( i=1; i<= nsites; i++) scanf(" %d",pos+i ); for( i=1; i<= nsites; i++) printf(" %d", pos[i] ) ; printf("\n"); for( j=0; j< 2*nsam; j++) for( i=0; i <= nsites; i++) scanf(" %s",gam[j][i] ) ; for( s1 = 1; s1 <= nsites; s1++) { i=0; while( (i < 2*nsam) && ( gam[i][s1][0] == '?') ) { i++; } if( i == 2*nsam ) nall[s1] = 0 ; else{ for( j= i+1; j< 2*nsam; j++) if( strcmp( gam[i][s1], gam[j][s1] ) == 0 ) { gam[j][s1][0] = 1 ; } gam[i][s1][0] = 1 ; j = i+1 ; while( ( j < 2*nsam) && (( gam[j][s1][0] == '?' ) || (gam[j][s1][0] == 1 ) ) ) { j++ ; } if( j == 2*nsam ) nall[s1] = 1 ; else { for( k=j+1; k< 2*nsam; k++){ if( strcmp( gam[j][s1], gam[k][s1]) == 0 ){ gam[k][s1][0] = 2 ; } } gam[j][s1][0] = 2 ; count1 = count2 = countq = 0 ; for( i=0; i< 2*nsam; i++){ a = gam[i][s1][0] ; if( a == 1 ) count1++; else if( a == 2 ) count2++; else if( a == '?' ) countq++; } if( count1+count2 + countq == 2*nsam ) nall[s1] =2 ; else nall[s1] = 3 ; } } printf(" %d ",nall[s1]); } /* for( i=0; i< 2*nsam; i++) { printf("\n"); for( j=1; j<=nsites; j++) printf(" %d",gam[i][j][0] ); } */ printf("\n"); for( s1=1; s1 < nsites; s1++){ if( nall[s1] == 2 ) for( s2 = s1+1; s2 <= nsites; s2++){ if( nall[s2] == 2 ) { for( i=0; i<3; i++) for( j=0; j<3; j++) gc[i][j] = 0 ; for( i=0; i= 0 ) && ( b >= 0 ) ) gc[a][b]++ ; } printf("%d %d %d %d %d %d %d %d %d %d %d %d ",pos[s1],pos[s2],pos[s2]-pos[s1], gc[0][0],gc[0][1],gc[0][2],gc[1][0], gc[1][1],gc[1][2],gc[2][0],gc[2][1],gc[2][2] ) ; gen[1] = gc[0][0]; gen[2] = gc[0][1]; gen[3] = gc[0][2]; gen[4] = gc[1][0]; gen[5] = gc[1][1]; gen[6] = gc[1][2]; gen[7] = gc[2][0]; gen[8] = gc[2][1]; gen[9] = gc[2][2] ; n = gen[1] + gen[2] + gen[3] + gen[4] + gen[5] + gen[6] + gen[7] + gen[8] + gen[9] ; p0 = ( gen[1] + gen[2] + gen[3] + 0.5*(gen[4] + gen[5] + gen[6]) ) / n ; q0 = ( gen[1] + gen[4] + gen[7] + 0.5*(gen[2] + gen[5] + gen[8]) ) / n ; dmin = MAX( -p0*q0, -(1.0-p0)*(1.0-q0) ) ; dmax = MIN( (1.0-p0)*q0, p0*(1.0-q0) ) ; d = mled( ); dprime = (d < 0) ? -d/dmin : d/dmax ; rsq = (d*d)/(p0*(1.0-p0)*q0*(1.0-q0)) ; printf(" %lf %lf %lf %lf %lf\n",p0,q0,d, dprime, rsq ); } }} } double mled( ) { double d, ep, dmin, dmax ; double p00 ; double lnli(double); double best; if( gen[5] == 0 ){ p00 = (2*gen[1] + gen[2] + gen[4])/(2.0*n) ; return( p00 - p0*q0 ) ; } else{ /* need to determine whether, mininum is at extreme*/ dmin = MAX( -p0*q0, -(1.0-p0)*(1.0-q0) ) ; dmax = MIN( (1.0-p0)*q0, p0*(1.0-q0) ) ; ep = (dmax - dmin)/1000.0 ; best = dmin ; for( d = dmin; d<= dmax; d += ep ){ if( lnli( d) < lnli( best ) ) best = d ; /* printf(" %lf %lf\n",d,lnli(d) ) ; */ } if( lnli(dmax ) < lnli(best) ) best = dmax ; return( best ) ; } } double lnli( double d) { int i; double p00, p01, p10, p11, xi[10] ; double sum ; p00 = p0*q0 + d ; p01 = p0*(1.0-q0) -d ; p10 = (1.0-p0)*q0 -d ; p11 = (1.0-p0)*(1.0-q0) + d ; xi[1] = p00*p00; xi[2] = 2.0*p00*p01 ; xi[3] = p01*p01 ; xi[4] = 2.0*p00*p10 ; xi[5] = 2.0*p00*p11 + 2.0*p01*p10 ; xi[6] = 2.0*p01*p11 ; xi[7] = p10*p10 ; xi[8] = 2.0*p10*p11 ; xi[9] = p11*p11 ; sum = 0.0 ; for( i=1;i<=9; i++){ if( (gen[i] > 0) && (xi[i]>0) ) sum += gen[i]*log( xi[i] ) ; else if( (gen[i] >0) && (xi[i] <= 0) ) sum += -999999. ; } return( (-1.0)*sum ) ; }