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;
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 )
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 )
{
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 )
{
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;