#include "mltaln.h" #define TEST 0 static int treeout = 0; #ifdef enablemultithread typedef struct _jobtable { int i; int j; } Jobtable; typedef struct _thread_arg { int njob; int thread_no; float *selfscore; double **mtx; char **seq; Jobtable *jobpospt; pthread_mutex_t *mutex; } thread_arg_t; void *athread( void *arg ) { thread_arg_t *targ = (thread_arg_t *)arg; int njob = targ->njob; int thread_no = targ->thread_no; float *selfscore = targ->selfscore; double **mtx = targ->mtx; char **seq = targ->seq; Jobtable *jobpospt = targ->jobpospt; int i, j; float ssi, ssj, bunbo; while( 1 ) { pthread_mutex_lock( targ->mutex ); j = jobpospt->j; i = jobpospt->i; j++; if( j == njob ) { fprintf( stderr, "%4d/%4d (thread %4d), dndpre\r", i+1, njob, thread_no ); i++; j = i + 1; if( i == njob-1 ) { pthread_mutex_unlock( targ->mutex ); return( NULL ); } } jobpospt->j = j; jobpospt->i = i; pthread_mutex_unlock( targ->mutex ); ssi = selfscore[i]; ssj = selfscore[j]; bunbo = MIN( ssi, ssj ); if( bunbo == 0.0 ) mtx[i][j] = 1.0; else mtx[i][j] = 1.0 - (double)naivepairscore11( seq[i], seq[j], penalty ) / bunbo; } } #endif void arguments( int argc, char *argv[] ) { int c; nthread = 1; alg = 'X'; fmodel = 0; treeout = 0; scoremtx = 1; nblosum = 62; dorp = NOTSPECIFIED; inputfile = NULL; ppenalty = NOTSPECIFIED; //? ppenalty_ex = NOTSPECIFIED; //? poffset = NOTSPECIFIED; //? kimuraR = NOTSPECIFIED; pamN = NOTSPECIFIED; while( --argc > 0 && (*++argv)[0] == '-' ) { while ( (c = *++argv[0]) ) { switch( c ) { case 't': treeout = '1'; break; case 'D': dorp = 'd'; break; case 'a': fmodel = 1; break; case 'P': dorp = 'p'; break; case 'i': inputfile = *++argv; fprintf( stderr, "inputfile = %s\n", inputfile ); --argc; goto nextoption; case 'C': nthread = atoi( *++argv ); fprintf( stderr, "nthread = %d\n", nthread ); --argc; goto nextoption; } } nextoption: ; } if( argc != 0 ) { fprintf( stderr, "options: Check source file !\n" ); exit( 1 ); } } int main( int argc, char **argv ) { int i, j; char **seq; static char **name; static int nlen[M]; float *selfscore; double **mtx; FILE *fp; FILE *infp; float ssi, ssj, bunbo; arguments( argc, argv ); #ifndef enablemultithread nthread = 0; #endif if( inputfile ) { infp = fopen( inputfile, "r" ); if( !infp ) { fprintf( stderr, "Cannot open %s\n", inputfile ); exit( 1 ); } } else infp = stdin; #if 0 PreRead( stdin, &njob, &nlenmax ); #else getnumlen( infp ); #endif rewind( infp ); seq = AllocateCharMtx( njob, nlenmax+1 ); name = AllocateCharMtx( njob, B+1 ); mtx = AllocateDoubleMtx( njob, njob ); selfscore = AllocateFloatVec( njob ); #if 0 FRead( stdin, name, nlen, seq ); #else readData_pointer( infp, name, nlen, seq ); #endif fclose( infp ); constants( njob, seq ); #if 0 for( i=0; i 0 ) { thread_arg_t *targ; Jobtable jobpos; pthread_t *handle; pthread_mutex_t mutex; jobpos.i = 0; jobpos.j = 0; targ = calloc( nthread, sizeof( thread_arg_t ) ); handle = calloc( nthread, sizeof( pthread_t ) ); pthread_mutex_init( &mutex, NULL ); for( i=0; i