Fix core WST file
[jabaws.git] / binaries / src / mafft / core / fftFunctions.c
index 4d1b2c9..927dc3f 100644 (file)
@@ -179,13 +179,15 @@ int alignableReagion( int    clus1, int    clus2,
        int value = 0;
        int len, maxlen;
        int length = 0; // by D.Mathog, a gess
-       static double *stra = NULL;
-       static int alloclen = 0;
+       static TLS double *stra = NULL;
+       static TLS int alloclen = 0;
        double totaleff;
        double cumscore;
-       static double threshold;
-       static double prf1[26], prf2[26];
-       static int hat1[27], hat2[27];
+       static TLS double threshold;
+       static TLS double *prf1 = NULL;
+       static TLS double *prf2 = NULL;
+       static TLS int *hat1 = NULL;
+       static TLS int *hat2 = NULL;
        int pre1, pre2;
 #if 0
        char **seq1pt;
@@ -202,6 +204,24 @@ int alignableReagion( int    clus1, int    clus2,
        fprintf( stderr, "eff2[0] = %f\n", eff2[0] );
 #endif
 
+       if( clus1 == 0 )
+       {
+               FreeDoubleVec( stra ); stra = NULL;
+               FreeDoubleVec( prf1 ); prf1 = NULL;
+               FreeDoubleVec( prf2 ); prf2 = NULL;
+               FreeIntVec( hat1 ); hat1 = NULL;
+               FreeIntVec( hat2 ); hat2 = NULL;
+               return( 0 );
+       }
+
+       if( prf1 == NULL )
+       {
+               prf1 = AllocateDoubleVec( 26 );
+               prf2 = AllocateDoubleVec( 26 );
+               hat1 = AllocateIntVec( 27 );
+               hat2 = AllocateIntVec( 27 );
+       }
+
        len = MIN( strlen( seq1[0] ), strlen( seq2[0] ) );
        maxlen = MAX( strlen( seq1[0] ), strlen( seq2[0] ) ) + fftWinSize;
        if( alloclen < maxlen )
@@ -353,138 +373,6 @@ fprintf( stderr, "%d-%d length = %d\n", seg->start, seg->end, length );
        return( value );
 }
 
-void blockAlign( int *cut1, int *cut2, double **ocrossscore, int *ncut )
-{
-       int i, j, shift, cur1, cur2, count;
-       static int result1[MAXSEG], result2[MAXSEG];
-       static int ocut1[MAXSEG], ocut2[MAXSEG];
-       double maximum;
-       static double max[MAXSEG], maxi;
-       static double point[MAXSEG], pointi;
-       static double **crossscore = NULL;
-       static int **track = NULL;
-
-       if( crossscore == NULL )
-       {
-               crossscore = AllocateDoubleMtx( MAXSEG, MAXSEG );
-               track = AllocateIntMtx( MAXSEG, MAXSEG );
-       }
-
-#if 0
-       for( i=0; i<*ncut; i++ )
-               fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] );
-       for( i=0; i<*ncut; i++ ) 
-       {
-               for( j=0; j<*ncut; j++ )
-                       fprintf( stderr, "%#4.0f ", ocrossscore[i][j]/100 );
-               fprintf( stderr, "\n" );
-       }
-#endif
-
-       for( i=0; i<*ncut; i++ ) for( j=0; j<*ncut; j++ )  /* mudadanaa */
-               crossscore[i][j] = ocrossscore[i][j];
-       for( i=0; i<*ncut; i++ ) 
-       {
-               ocut1[i] = cut1[i];
-               ocut2[i] = cut2[i];
-       }
-
-       for( j=0; j<*ncut; j++ )
-       {
-               max[j] = 0.0;
-               point[j] = 0;
-       }
-
-       for( i=1; i<*ncut; i++ )
-       {
-               maxi = 0.0;
-               pointi = 0;
-               for( j=1; j<*ncut; j++ )
-               {
-                       maximum = crossscore[i-1][j-1];
-                       track[i][j] = 0;
-
-                       if( maximum < max[j] + penalty )
-                       {
-                               maximum = max[j] + penalty;
-                               track[i][j] = point[j] - i;
-                       }
-                       if( maximum < maxi + penalty )
-                       {
-                               maximum = maxi + penalty;
-                               track[i][j] = j - pointi;
-                       }
-                       crossscore[i][j] += maximum;
-
-                       if( maxi < crossscore[i-1][j-1] )
-                       {
-                               maxi = crossscore[i-1][j-1];
-                               pointi = j-1;
-                       }
-                       if( max[j] < crossscore[i-1][j-1] )
-                       {
-                               max[j] = crossscore[i-1][j-1];
-                               point[j] = i-1;
-                       }
-               }
-       }
-#if 1
-       for( i=0; i<*ncut; i++ ) 
-       {
-               for( j=0; j<*ncut; j++ )
-                       fprintf( stderr, "%3d ", track[i][j] );
-               fprintf( stderr, "\n" );
-       }
-#endif
-
-
-       result1[MAXSEG-1] = *ncut-1;
-       result2[MAXSEG-1] = *ncut-1;
-
-       for( i=MAXSEG-1; i>=1; i-- )
-       {
-               cur1 = result1[i];
-               cur2 = result2[i];
-               if( cur1 == 0 || cur2 == 0 ) break;
-               shift = track[cur1][cur2];
-               if( shift == 0 )
-               {
-                       result1[i-1] = cur1 - 1;
-                       result2[i-1] = cur2 - 1;
-                       continue;
-               }
-               else if( shift > 0 )
-               {
-                       result1[i-1] = cur1 - 1;
-                       result2[i-1] = cur2 - shift;
-               }
-               else if( shift < 0 )
-               {
-                       result1[i-1] = cur1 + shift;
-                       result2[i-1] = cur2 - 1;
-               }
-       }
-
-       count = 0;
-       for( j=i; j<MAXSEG; j++ )
-       {
-               if( ocrossscore[result1[j]][result2[j]] == 0.0 ) continue;
-
-               if( result1[j] == result1[j-1] || result2[j] == result2[j-1] )
-                       if( ocrossscore[result1[j]][result2[j]] > ocrossscore[result1[j-1]][result2[j-1]] )
-                               count--;
-                               
-               cut1[count] = ocut1[result1[j]];
-               cut2[count] = ocut2[result2[j]];
-               count++;
-       }
-
-       *ncut = count;
-#if 0
-       for( i=0; i<*ncut; i++ )
-               fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] );
-#endif
-}
 
 static int permit( Segment *seg1, Segment *seg2 )
 {
@@ -497,15 +385,38 @@ static int permit( Segment *seg1, Segment *seg2 )
 void blockAlign2( int *cut1, int *cut2, Segment **seg1, Segment **seg2, double **ocrossscore, int *ncut )
 {
        int i, j, k, shift, cur1, cur2, count, klim;
-       static int crossscoresize = 0;
-       static int result1[MAXSEG], result2[MAXSEG];
-       static int ocut1[MAXSEG], ocut2[MAXSEG];
+       static TLS int crossscoresize = 0;
+       static TLS int *result1 = NULL;
+       static TLS int *result2 = NULL;
+       static TLS int *ocut1 = NULL;
+       static TLS int *ocut2 = NULL;
        double maximum;
-       static double **crossscore = NULL;
-       static int **track = NULL;
-       static double maxj, maxi;
-       static int pointj, pointi;
+       static TLS double **crossscore = NULL;
+       static TLS int **track = NULL;
+       static TLS double maxj, maxi;
+       static TLS int pointj, pointi;
 
+       if( cut1 == NULL) 
+       {
+               if( result1 )
+               {
+                       free( result1 );
+                       free( result2 );
+                       free( ocut1 );
+                       free( ocut2 );
+                       FreeIntMtx( track );
+               FreeDoubleMtx( crossscore );
+               }
+               return;
+       }
+
+       if( result1 == NULL )
+       {
+               result1 = AllocateIntVec( MAXSEG );
+               result2 = AllocateIntVec( MAXSEG );
+               ocut1 = AllocateIntVec( MAXSEG );
+               ocut2 = AllocateIntVec( MAXSEG );
+       }
 
     if( crossscoresize < *ncut+2 )
     {
@@ -652,19 +563,29 @@ void blockAlign2( int *cut1, int *cut2, Segment **seg1, Segment **seg2, double *
                fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] );
 #endif
 }
+
 void blockAlign3( int *cut1, int *cut2, Segment **seg1, Segment **seg2, double **ocrossscore, int *ncut )
 // memory complexity = O(n^3), time complexity = O(n^2)
 {
        int i, j, shift, cur1, cur2, count;
-       static int crossscoresize = 0;
-       static int jumpposi, *jumppos;
-       static double jumpscorei, *jumpscore;
-       static int result1[MAXSEG], result2[MAXSEG];
-       static int ocut1[MAXSEG], ocut2[MAXSEG];
+       static TLS int crossscoresize = 0;
+       static TLS int jumpposi, *jumppos;
+       static TLS double jumpscorei, *jumpscore;
+       static TLS int *result1 = NULL;
+       static TLS int *result2 = NULL;
+       static TLS int *ocut1 = NULL;
+       static TLS int *ocut2 = NULL;
        double maximum;
-       static double **crossscore = NULL;
-       static int **track = NULL;
+       static TLS double **crossscore = NULL;
+       static TLS int **track = NULL;
 
+       if( result1 == NULL )
+       {
+               result1 = AllocateIntVec( MAXSEG );
+               result2 = AllocateIntVec( MAXSEG );
+               ocut1 = AllocateIntVec( MAXSEG );
+               ocut2 = AllocateIntVec( MAXSEG );
+       }
     if( crossscoresize < *ncut+2 )
     {
         crossscoresize = *ncut+2;