diff mafft/core/tddis.c @ 18:e4d75f9efb90 draft

planemo upload commit b'4303231da9e48b2719b4429a29b72421d24310f4\n'-dirty
author nick
date Thu, 02 Feb 2017 18:44:31 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mafft/core/tddis.c	Thu Feb 02 18:44:31 2017 -0500
@@ -0,0 +1,905 @@
+#include "mltaln.h"
+
+#define DEBUG 0
+
+#if 0
+void mdfymtx( char pair[njob][njob], int s1, double **partialmtx, double **mtx )
+#else
+void mdfymtx( char **pair, int s1, double **partialmtx, double **mtx )
+#endif
+{
+	int i, j;
+	int icount, jcount;
+#if DEBUG
+	FILE *fp;
+	static char name[M][B];
+
+	for( i=0; i<M; i++ ) name[i][0] = 0;
+	fprintf( stdout, "s1 = %d\n", s1 );
+	for( i=0; i<njob; i++ ) 
+	{
+		for( j=0; j<njob; j++ ) 
+		{
+			printf( "%#2d", pair[i][j] );
+		}
+		printf( "\n" );
+	}
+#endif
+
+	for( i=0, icount=0; i<njob-1; i++ )
+	{
+		if( !pair[s1][i] ) continue;
+		for( j=i+1, jcount=icount+1; j<njob; j++ ) 
+		{
+			if( !pair[s1][j] ) continue;
+			partialmtx[icount][jcount] = mtx[i][j];
+			jcount++;
+		}
+		icount++;
+	}
+#if DEBUG
+	fp = fopen( "hat2.org", "w" );
+	WriteHat2( fp, njob, name, mtx );
+	fclose( fp );
+	fp = fopen( "hat2.mdf", "w" );
+	WriteHat2( fp, icount, name, partialmtx );
+	fclose( fp );
+#endif
+		
+}
+
+		
+float score_calc( char **seq, int s )  /* method 3  */
+{
+    int i, j, k, c;
+    int len = strlen( seq[0] );
+    float score;
+    int tmpscore;
+    char *mseq1, *mseq2;
+
+    score = 0.0;
+    for( i=0; i<s-1; i++ )
+    {
+        for( j=i+1; j<s; j++ )
+        {
+            mseq1 = seq[i];
+            mseq2 = seq[j];
+            tmpscore = 0;
+            c = 0;
+            for( k=0; k<len; k++ )
+            {
+                if( mseq1[k] == '-' && mseq2[k] == '-' ) continue;
+                c++;
+                tmpscore += amino_dis[(int)mseq1[k]][(int)mseq2[k]];
+                if( mseq1[k] == '-' )
+                {
+                    tmpscore += penalty;
+                    while( mseq1[++k] == '-' )
+                        ;
+                    k--;
+                    if( k > len-2 ) break;
+                    continue;
+                }
+                if( mseq2[k] == '-' )
+                {
+                    tmpscore += penalty;
+                    while( mseq2[++k] == '-' )
+                        ;
+                    k--;
+                    if( k > len-2 ) break;
+                    continue;
+                }
+            }
+            /*
+            if( mseq1[0] == '-' || mseq2[0] == '-' )
+            {
+                for( k=0; k<len; k++ )
+                {
+                    if( mseq1[k] == '-' && mseq2[k] == '-' ) continue;
+                    if( !( mseq1[k] != '-' && mseq2[k] != '-' ) ) 
+                    {
+                        c--;
+                        tmpscore -= penalty;
+                        break;
+                    }
+                    else break;
+                }
+            }
+            if( mseq1[len-1] == '-' || mseq2[len-1] == '-' )
+            {
+                for( k=0; k<len; k++ )
+                {
+                    if( mseq1[k] == '-' && mseq2[k] == '-' ) continue;
+                    if( !( mseq1[k] != '-' && mseq2[k] != '-' ) ) 
+                    {
+                        c--;
+                        tmpscore -= penalty;
+                        break;
+                    }
+                    else break;
+                }
+            }
+            */
+            score += (double)tmpscore / (double)c;
+        }
+    }
+    score = (float)score / ( ( (double)s * ((double)s-1.0) ) / 2.0 );
+	fprintf( stderr, "score in score_calc = %f\n", score );
+    return( score );
+}
+
+void cpmx_calc( char **seq, float **cpmx, double *eff, int lgth, int clus )
+{
+	int  i, j, k;
+	double totaleff = 0.0;
+
+	for( i=0; i<clus; i++ ) totaleff += eff[i]; 
+	for( i=0; i<nalphabets; i++ ) for( j=0; j<lgth; j++ ) cpmx[i][j] = 0.0;
+	for( j=0; j<lgth; j++ ) for( k=0; k<clus; k++ )
+			cpmx[(int)amino_n[(int)seq[k][j]]][j] += (float)eff[k] / totaleff;
+}
+
+
+void cpmx_calc_new_bk( char **seq, float **cpmx, double *eff, int lgth, int clus ) // summ eff must be 1.0 
+{
+    int  i, j, k;
+    float feff;
+
+    for( i=0; i<nalphabets; i++ ) for( j=0; j<lgth; j++ ) cpmx[i][j] = 0.0;
+    for( k=0; k<clus; k++ )
+    {
+        feff = (float)eff[k];
+        for( j=0; j<lgth; j++ ) 
+        {
+            cpmx[(int)amino_n[(int)seq[k][j]]][j] += feff;
+        }
+    }
+}
+
+void cpmx_calc_new( char **seq, float **cpmx, double *eff, int lgth, int clus ) // summ eff must be 1.0
+{
+	int  i, j, k;
+	float feff;
+	float *cpmxpt, **cpmxptpt;
+	char *seqpt;
+
+	j = nalphabets;
+	cpmxptpt = cpmx;
+	while( j-- )
+	{
+		cpmxpt = *cpmxptpt++;
+		i = lgth;
+		while( i-- )
+			*cpmxpt++ = 0.0;
+	}
+	for( k=0; k<clus; k++ )
+	{
+		feff = (float)eff[k];
+		seqpt = seq[k];
+//		fprintf( stderr, "seqpt = %s, lgth=%d\n", seqpt, lgth );
+		for( j=0; j<lgth; j++ )
+		{
+			cpmx[(int)amino_n[(int)*seqpt++]][j] += feff;
+		}
+	}
+}
+void MScpmx_calc_new( char **seq, float **cpmx, double *eff, int lgth, int clus ) // summ eff must be 1.0
+{
+	int  i, j, k;
+	float feff;
+	float **cpmxptpt, *cpmxpt;
+	char *seqpt;
+
+	j = lgth;
+	cpmxptpt = cpmx;
+	while( j-- )
+	{
+		cpmxpt = *cpmxptpt++;
+		i = nalphabets;
+		while( i-- )
+			*cpmxpt++ = 0.0;
+	}
+	for( k=0; k<clus; k++ )
+	{
+		feff = (float)eff[k];
+		seqpt = seq[k];
+		cpmxptpt = cpmx;
+		j = lgth;
+		while( j-- )
+			(*cpmxptpt++)[(int)amino_n[(int)*seqpt++]] += feff;
+	}
+#if 0
+	for( j=0; j<lgth; j++ ) for( i=0; i<nalphabets; i++ ) cpmx[j][i] = 0.0;
+	for( k=0; k<clus; k++ )
+	{
+		feff = (float)eff[k];
+		for( j=0; j<lgth; j++ ) 
+			cpmx[j][(int)amino_n[(int)seq[k][j]]] += feff;
+	}
+#endif
+}
+
+void cpmx_ribosum( char **seq, char **seqr, char *dir, float **cpmx, double *eff, int lgth, int clus ) // summ eff must be 1.0
+{
+	int  i, j, k;
+	float feff;
+	float **cpmxptpt, *cpmxpt;
+	char *seqpt, *seqrpt, *dirpt;
+	int code, code1, code2;
+
+	j = lgth;
+	cpmxptpt = cpmx;
+	while( j-- )
+	{
+		cpmxpt = *cpmxptpt++;
+		i = 37;
+		while( i-- )
+			*cpmxpt++ = 0.0;
+	}
+	for( k=0; k<clus; k++ )
+	{
+		feff = (float)eff[k];
+		seqpt = seq[k];
+		seqrpt = seqr[k];
+		dirpt = dir;
+		cpmxptpt = cpmx;
+		j = lgth;
+		while( j-- )
+		{
+#if 0
+			code1 = amino_n[(int)*seqpt];
+			if( code1 > 3 ) code = 36;
+			else
+				code = code1;
+#else
+			code1 = amino_n[(int)*seqpt];
+			code2 = amino_n[(int)*seqrpt];
+			if( code1 > 3 ) 
+			{
+				code = 36;
+			}
+			else if( code2 > 3 )
+			{
+				code = code1;
+			}
+			else if( *dirpt == '5' ) 
+			{
+				code = 4 + code2 * 4  + code1;
+			}
+			else if( *dirpt == '3' ) 
+			{
+				code = 20 + code2 * 4  + code1;
+			}
+			else // if( *dirpt == 'o' ) // nai 
+			{
+				code = code1;
+			}
+#endif
+
+//			fprintf( stderr, "%c -> code=%d toa=%d, tog=%d, toc=%d, tot=%d, ton=%d, efee=%f\n", *seqpt, code%4, ribosumdis[code][4+0], ribosumdis[code][4+1], ribosumdis[code][4+2], ribosumdis[code][20+3], ribosumdis[code][36], feff );
+
+			seqpt++;
+			seqrpt++;
+			dirpt++;
+			
+			(*cpmxptpt++)[code] += feff;
+		}
+	}
+}
+
+void mseqcat( char **seq1, char **seq2, double **eff, double *effarr1, double *effarr2, char name1[M][B], char name2[M][B], int clus1, int clus2 )
+{
+	int i, j;
+    for( i=0; i<clus2; i++ )
+        seq1[clus1+i] = seq2[i];
+    for( i=0; i<clus2; i++ ) strcpy( name1[clus1+i], name2[i] );
+
+	for( i=0; i<clus1; i++ ) for( j=0; j<clus1; j++ ) eff[i][j] = effarr1[i]* effarr1[j]; 
+	for( i=0; i<clus1; i++ ) for( j=clus1; j<clus1+clus2; j++ ) eff[i][j] = effarr1[i]* effarr2[j-clus1]; 
+	for( i=clus1; i<clus1+clus2; i++ ) for( j=0; j<clus1; j++ ) eff[i][j] = effarr2[i-clus1] * effarr1[j]; 
+	for( i=clus1; i<clus1+clus2; i++ ) for( j=clus1; j<clus1+clus2; j++ ) eff[i][j] = effarr2[i-clus1] * effarr2[j-clus1]; 
+}
+
+	
+
+#if 0
+int conjuction( char pair[njob][njob], int s, char **seq, char **aseq, double *peff, double *eff, char name[M][B], char aname[M][B], char *d )
+#else
+int conjuctionforgaln( int s0, int s1, char **seq, char **aseq, double *peff, double *eff, char **name, char **aname, char *d )
+#endif
+{
+	int m, k;
+	char b[B];
+	double total;
+
+#if 0
+	fprintf( stderr, "s0 = %d, s1 = %d\n", s0, s1 );
+#endif
+
+	total = 0.0;
+	d[0] = 0;
+	for( m=s0, k=0; m<s1; m++ )
+	{
+		{
+			sprintf( b, " %d", m+1 ); 
+#if 1
+			if( strlen( d ) < 100 ) strcat( d, b );
+#else
+			strcat( d, b );
+#endif
+			aseq[k] = seq[m];
+			peff[k] = eff[m];
+			total += peff[k];
+#if 0
+			strcpy( aname[k], name[m] );
+#endif
+			k++;
+		}
+	}
+#if 1
+	for( m=0; m<k; m++ )
+	{
+		peff[m] /= total;
+//		fprintf( stderr, "peff[%d] = %f\n", m, peff[m] );
+	}
+#endif
+	return( k );
+}
+
+void makegrouprna( RNApair ***group, RNApair ***all, int *memlist )
+{
+	int k, m;
+	for( k=0; (m=*memlist)!=-1; memlist++, k++ )
+	{
+		group[k] = all[m];
+	}
+}
+
+
+int fastconjuction_noweight( int *memlist, char **seq, char **aseq, double *peff, char *d )
+{
+	int m, k, dln;
+	char b[B];
+	double total;
+
+#if DEBUG
+	fprintf( stderr, "s = %d\n", s );
+#endif
+
+	total = 0.0;
+	d[0] = 0;
+	dln = 0;
+	for( k=0; *memlist!=-1; memlist++, k++ )
+	{
+		m = *memlist;
+		dln += sprintf( b, " %d", m+1 ); 
+#if 1
+		if( dln < 100 ) strcat( d, b );
+#else
+		strcat( d, b );
+#endif
+		aseq[k] = seq[m];
+		peff[k] = 1.0;
+		total += peff[k];
+	}
+#if 1
+	for( m=0; m<k; m++ )
+		peff[m] /= total;
+#endif
+	return( k );
+}
+
+int fastconjuction_noname_kozo( int *memlist, char **seq, char **aseq, double *peff, double *eff, double *peff_kozo, double *eff_kozo, char *d )
+{
+	int m, k, dln;
+	char b[B];
+	double total;
+	double total_kozo;
+
+#if DEBUG
+	fprintf( stderr, "s = %d\n", s );
+#endif
+
+	total = 0.0;
+	total_kozo = 0.0;
+	d[0] = 0;
+	dln = 0;
+	for( k=0; *memlist!=-1; memlist++, k++ )
+	{
+		m = *memlist;
+		dln += sprintf( b, " %d", m+1 ); 
+#if 1
+		if( dln < 100 ) strcat( d, b );
+#else
+		strcat( d, b );
+#endif
+		aseq[k] = seq[m];
+		peff[k] = eff[m];
+		peff_kozo[k] = eff_kozo[m];
+		total += peff[k];
+		total_kozo += peff_kozo[k];
+	}
+#if 1
+	for( m=0; m<k; m++ )
+	{
+//		fprintf( stderr, "peff[%d] = %f\n", m, peff[m] );
+		peff[m] /= total;
+	}
+	if( total_kozo ) 
+	{
+		for( m=0; m<k; m++ )
+		{
+//			fprintf( stderr, "peff[%d] = %f\n", m, peff[m] );
+			peff_kozo[m] /= total_kozo;
+			if( peff_kozo[m] > 0.0 ) peff_kozo[m] += peff[m];
+		}
+	}
+	else  //iranai
+	{
+		for( m=0; m<k; m++ )
+		{
+			peff_kozo[m] = 0.0;
+		}
+	}
+#endif
+
+//	fprintf( stderr, "\n\ntbfast_total_kozo = %f\n\n", total_kozo );
+	return( k );
+}
+
+
+int fastconjuction_noname( int *memlist, char **seq, char **aseq, double *peff, double *eff, char *d, double mineff  )
+{
+	int m, k, dln;
+	char b[B];
+	double total;
+
+#if DEBUG
+	fprintf( stderr, "s = %d\n", s );
+#endif
+
+	total = 0.0;
+	d[0] = 0;
+	dln = 0;
+	for( k=0; *memlist!=-1; memlist++, k++ )
+	{
+		m = *memlist;
+		dln += sprintf( b, " %d", m+1 ); 
+#if 1
+		if( dln < 100 ) strcat( d, b );
+#else
+		strcat( d, b );
+#endif
+		aseq[k] = seq[m];
+		if( eff[m] < mineff )
+			peff[k] = mineff;
+		else
+			peff[k] = eff[m];
+
+		total += peff[k];
+	}
+#if 1
+	for( m=0; m<k; m++ )
+	{
+//		fprintf( stderr, "peff[%d] = %f\n", m, peff[m] );
+		peff[m] /= total;
+	}
+#endif
+	return( k );
+}
+
+int fastconjuction( int *memlist, char **seq, char **aseq, double *peff, double *eff, char name[M][B], char aname[M][B], char *d )
+{
+	int m, k, dln;
+	char b[B];
+	double total;
+
+#if DEBUG
+	fprintf( stderr, "s = %d\n", s );
+#endif
+
+	total = 0.0;
+	d[0] = 0;
+	dln = 0;
+	for( k=0; *memlist!=-1; memlist++, k++ )
+	{
+		m = *memlist;
+		dln += sprintf( b, " %d", m+1 ); 
+#if 1
+		if( dln < 100 ) strcat( d, b );
+#else
+		strcat( d, b );
+#endif
+		aseq[k] = seq[m];
+		peff[k] = eff[m];
+		total += peff[k];
+#if 0
+			strcpy( aname[k], name[m] );
+#endif
+	}
+#if 1
+	for( m=0; m<k; m++ )
+		peff[m] /= total;
+#endif
+	return( k );
+}
+
+
+
+int conjuctionfortbfast_old( char **pair, int s, char **seq, char **aseq, double *peff, double *eff, char *d )
+{
+	int m, k;
+	char *b;
+	double total;
+
+	b = calloc( B, sizeof( char ) );
+#if DEBUG
+	fprintf( stderr, "s = %d\n", s );
+#endif
+
+	total = 0.0;
+	d[0] = 0;
+	for( m=s, k=0; m<njob; m++ )
+	{
+		if( pair[s][m] != 0 )
+		{
+			sprintf( b, " %d", m+1 ); 
+#if 1
+			if( strlen( d ) < 100 ) strcat( d, b );
+#else
+			strcat( d, b );
+#endif
+			aseq[k] = seq[m];
+			peff[k] = eff[m];
+			total += peff[k];
+#if 0
+			strcpy( aname[k], name[m] );
+#endif
+			k++;
+		}
+	}
+#if 1
+	for( m=0; m<k; m++ )
+		peff[m] /= total;
+#endif
+	free( b );
+	return( k );
+}
+
+int conjuction( char **pair, int s, char **seq, char **aseq, double *peff, double *eff, char **name, char **aname, char *d )
+{
+	int m, k;
+	char b[B];
+	double total;
+
+#if DEBUG
+	fprintf( stderr, "s = %d\n", s );
+#endif
+
+	total = 0.0;
+	d[0] = 0;
+	for( m=s, k=0; m<njob; m++ )
+	{
+		if( pair[s][m] != 0 )
+		{
+			sprintf( b, " %d", m+1 ); 
+#if 1
+			if( strlen( d ) < 100 ) strcat( d, b );
+#else
+			strcat( d, b );
+#endif
+			aseq[k] = seq[m];
+			peff[k] = eff[m];
+			total += peff[k];
+#if 0
+			strcpy( aname[k], name[m] );
+#endif
+			k++;
+		}
+	}
+#if 0
+	for( m=0; m<k; m++ )
+		peff[m] /= total;
+#endif
+	return( k );
+}
+			
+void floatdelete( float **cpmx, int d, int len )
+{
+	int i, j;
+
+	for( i=d; i<len-1; i++ )
+	{
+		for( j=0; j<nalphabets; j++ )
+		{
+			cpmx[j][i] = cpmx[j][i+1]; 
+		}
+	}
+}
+		
+void chardelete( char *seq, int d )
+{
+	char b[N]; 
+
+		strcpy( b, seq+d+1 );
+		strcpy( seq+d, b );
+}
+
+int RootBranchNode( int nseq, int ***topol, int step, int branch )
+{
+	int i, j, s1, s2, value;
+
+	value = 1;
+	for( i=step+1; i<nseq-2; i++ ) 
+	{
+		for( j=0; (s1=topol[i][0][j])>-1; j++ ) 
+			if( s1 == topol[step][branch][0] ) value++;
+		for( j=0; (s2=topol[i][1][j])>-1; j++ ) 
+			if( s2 == topol[step][branch][0] ) value++;
+	}
+	return( value );
+}
+
+void BranchLeafNode( int nseq, int ***topol, int *node, int step, int branch )
+{
+	int i, j, k, s;
+
+	for( i=0; i<nseq; i++ ) node[i] = 0;
+	for( i=0; i<step-1; i++ )
+		for( k=0; k<2; k++ ) 
+			for( j=0; (s=topol[i][k][j])>-1; j++ ) 
+				node[s]++;
+	for( k=0; k<branch+1; k++ ) 
+		for( j=0; (s=topol[step][k][j])>-1; j++ )
+			node[s]++;
+}
+
+void RootLeafNode( int nseq, int ***topol, int *node )
+{
+	int i, j, k, s;
+	for( i=0; i<nseq; i++ ) node[i] = 0;
+	for( i=0; i<nseq-2; i++ )
+		for( k=0; k<2; k++ ) 
+			for( j=0; (s=topol[i][k][j])>-1; j++ ) 
+				node[s]++;
+}
+		
+void nodeFromABranch( int nseq, int *result, int **pairwisenode, int ***topol, double **len, int step, int num )
+{
+	int i, s, count;
+	int *innergroup;
+	int *outergroup1;
+#if 0
+	int outergroup2[nseq];
+	int table[nseq];
+#else
+	static int *outergroup2 = NULL;
+	static int *table = NULL;
+	if( outergroup2 == NULL )
+	{
+		outergroup2 = AllocateIntVec( nseq );
+		table = AllocateIntVec( nseq );
+	}
+#endif
+	innergroup = topol[step][num];
+	outergroup1 = topol[step][!num];
+	for( i=0; i<nseq; i++ ) table[i] = 1;
+	for( i=0; (s=innergroup[i])>-1; i++ ) table[s] = 0;
+	for( i=0; (s=outergroup1[i])>-1; i++ ) table[s] = 0;
+	for( i=0, count=0; i<nseq; i++ ) 
+	{
+		if( table[i] )
+		{
+			outergroup2[count] = i;
+			count++;
+		}
+	}
+	outergroup2[count] = -1;
+
+	for( i=0; (s=innergroup[i])>-1; i++ )
+	{
+		result[s] = pairwisenode[s][outergroup1[0]]
+				  + pairwisenode[s][outergroup2[0]]
+				  - pairwisenode[outergroup1[0]][outergroup2[0]] - 1;
+		result[s] /= 2;
+	}
+	for( i=0; (s=outergroup1[i])>-1; i++ ) 
+	{
+		result[s] = pairwisenode[s][outergroup2[0]]
+				  + pairwisenode[s][innergroup[0]]
+				  - pairwisenode[innergroup[0]][outergroup2[0]] + 1;
+		result[s] /= 2;
+	}
+	for( i=0; (s=outergroup2[i])>-1; i++ ) 
+	{
+		result[s] = pairwisenode[s][outergroup1[0]]
+				  + pairwisenode[s][innergroup[0]]
+				  - pairwisenode[innergroup[0]][outergroup1[0]] + 1;
+		result[s] /= 2;
+	}
+
+#if 0
+	for( i=0; i<nseq; i++ ) 
+		fprintf( stderr, "result[%d] = %d\n", i+1, result[i] );
+#endif
+}
+		
+
+
+
+
+	
+
+		
+		
+					
+					
+
+				
+void OneClusterAndTheOther_fast( int locnjob, int *memlist1, int *memlist2, int *s1, int *s2, char *pair, int ***topol, int step, int branch, double **smalldistmtx, double **distmtx )
+{
+	int i, k, j;
+	int r1;
+//	char *pair;
+
+//	pair = calloc( locnjob, sizeof( char ) );
+
+	for( i=0; i<locnjob; i++ ) pair[i] = 0;
+    for( i=0, k=0; (r1=topol[step][branch][i])>-1; i++ ) 
+	{
+        pair[r1] = 1;
+		memlist1[k++] = r1;
+	}
+	memlist1[k] = -1;
+
+    for( i=0, k=0; i<locnjob; i++ ) 
+    {
+        if( !pair[i] ) 
+        {
+			memlist2[k++] = i;
+        }
+    }
+	memlist2[k] = -1;
+
+	*s1 = memlist1[0];
+	*s2 = memlist2[0];
+
+	if( smalldistmtx )
+	{
+		int im, jm;
+		for( i=0; (im=memlist1[i])!=-1; i++ ) for( j=0; (jm=memlist2[j])!=-1; j++ )
+		{
+			smalldistmtx[i][j] = distmtx[MIN(im,jm)][MAX(im,jm)];
+//			fprintf( stderr, "#### %d-%d, %f\n", im, jm, smalldistmtx[i][j] );
+		}
+	}
+//	free( pair );
+}
+		
+
+void makeEffMtx( int nseq, double **mtx, double *vec )
+{
+	int i, j;
+	for( i=0; i<nseq; i++ ) for( j=0; j<nseq; j++ ) 
+		mtx[i][j] = vec[i] * vec[j];
+}
+	
+void node_eff( int nseq, double *eff, int *node )
+{
+	int i;
+	extern double ipower( double, int );
+	for( i=0; i<nseq; i++ ) 
+		eff[i] = ipower( 0.5, node[i] ) + geta2;
+	/*
+		eff[i] = ipower( 0.5, node[i] ) + 0;
+	*/
+#if DEBUG
+	for( i=0; i<nseq; i++ ) 
+#endif
+}
+
+
+int shrinklocalhom( char **pair, int s1, int s2, LocalHom **localhom, LocalHom ***localhomshrink )
+{
+	int m1, k1, m2, k2;
+
+	for( m1=s1, k1=0; m1<njob; m1++ )
+	{
+		if( pair[s1][m1] != 0 )
+		{
+			for( m2=s2, k2=0; m2<njob; m2++ )
+			{
+				if( pair[s2][m2] != 0 )
+				{
+					if( localhom[m1][m2].opt == -1 )
+						localhomshrink[k1][k2] = NULL;
+					else
+						localhomshrink[k1][k2] = localhom[m1]+m2;
+					k2++;
+				}
+			}
+			k1++;
+		}
+	}
+	return( 0 );
+}
+
+int msshrinklocalhom_fast( int *memlist1, int *memlist2, LocalHom **localhom, LocalHom ***localhomshrink )
+{
+	int m1, k1, m2, k2;
+
+	for( k1=0; (m1=memlist1[k1])!=-1; k1++ )
+	{
+		for( k2=0; (m2=memlist2[k2])!=-1; k2++ )
+		{
+			if( localhom[m1][m2].opt == -1 )
+				localhomshrink[k1][k2] = NULL;
+			else
+				localhomshrink[k1][k2] = localhom[m1]+m2;
+		}
+	}
+	return( 0 );
+}
+int fastshrinklocalhom_one( int *mem1, int *mem2, int norg, LocalHom **localhom, LocalHom ***localhomshrink )
+{
+	int k1, k2;
+	int *intpt1, *intpt2;
+
+	
+	for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ )
+	{
+		for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ )
+		{
+			if( *intpt2 != norg ) 
+			{
+				fprintf( stderr, "ERROR! *intpt2 = %d\n", *intpt2 );
+				exit( 1 );
+			}
+			if( localhom[*intpt1][0].opt == -1 )
+				localhomshrink[k1][k2] = NULL;
+			else
+				localhomshrink[k1][k2] = localhom[*intpt1];
+		}
+	}
+	return( 0 );
+}
+
+int fastshrinklocalhom( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink )
+{
+	int k1, k2;
+	int *intpt1, *intpt2;
+
+	
+	for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ )
+	{
+		for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ )
+		{
+			if( localhom[*intpt1][*intpt2].opt == -1 )
+				localhomshrink[k1][k2] = NULL;
+			else
+				localhomshrink[k1][k2] = localhom[*intpt1]+*intpt2;
+		}
+	}
+	return( 0 );
+}
+
+int msfastshrinklocalhom( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink )
+{
+	int k1, k2;
+	int *intpt1, *intpt2;
+	int m1, m2;
+	
+	for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ )
+	{
+		for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ )
+		{
+			m1 = MIN(*intpt1,*intpt2); m2 = MAX(*intpt1,*intpt2);
+			if( localhom[m1][m2].opt == -1 )
+				localhomshrink[k1][k2] = NULL;
+			else
+				localhomshrink[k1][k2] = localhom[m1]+m2;
+		}
+	}
+	return( 0 );
+}
+