inline double normal() { double u_1 = 0; while (u_1 == 0) { u_1 = rndnum(); } double u_2 = 0; while (u_2 == 0) { u_2 = rndnum(); } return sqrt(-2*log(u_1)) * sin(2*PI*u_2); }
int rndval(int a, int b) { int temp; if (a == b) { return a; } if (b < a) { temp = a; a = b; b = temp; } temp = rndnum(b - a); return temp + a; }
int main(int argc, char **argv) { int i,j; int lpat,lbuffer; MILL *rand; if( argc < 2 ){ printf("Usage:\n\t%s <ref|train|test>\n",argv[0]); exit(0); } if( strcasecmp(argv[1],"ref") == 0 ) { lbuffer = 512*1024+17; lpat = 6; printf("KMP with reference input set\n"); }else if( strcasecmp(argv[1],"train") == 0 ){ lbuffer = 96*1024+17; lpat = 5; printf("KMP with test input set\n"); }else if( strcasecmp(argv[1],"test") == 0 ){ lbuffer = 32*1024+17; lpat = 4; printf("KMP with test input set\n"); }else{ printf("Invalid data set use ref or train or test\n"); exit(-1); } buffer = (char *)malloc(lbuffer); if( !buffer ){ fprintf(stderr,"Not enough memory\n"); exit(0); } rand = init_mill(0xf621,0x3128,0x8253); pat = (char *)malloc(lpat+1); next = (int *)malloc(sizeof(int)*lpat); if( !pat || !next ){ fprintf(stderr,"Not enough memory\n"); exit(0); } fprintf(stderr,"Benchmark begin...\n"); for(i=0;i<lbuffer;i++){ buffer[i] = rndnum(rand) % 7 + 'a'; } buffer[lbuffer-1]=0; /* end of buffer */ for(j=0;j<23;j++) { char *pos; int conta; printf("%2d Pattern:",j+1); for(i=0;i<lpat;i++){ pat[i] = rndnum(rand) % 7 + 'a'; printf("%c",pat[i]); } pat[lpat]=0; /* Shorten lenght of buffer */ buffer[3*lbuffer/(j % 3+3)-1]=0; conta = 0; pos = &buffer[(3*lbuffer/(j % 3+3)-1)/4]; while(1){ pos = search(pat,pos); if( pos == 0 ) break; pos++; conta++; } printf(": found %d times\n",conta); buffer[3*lbuffer/(j % 3+3)-1]= 'a'; } printf("Benchmark finish...\n"); nuke_mill(rand); return 0; }