#include "mltaln.h" #include "dp.h" #define MEMSAVE 1 #define DEBUG 0 #define USE_PENALTY_EX 0 #define STOREWM 0 #define DPTANNI 100 static TLS int reccycle = 0; static void match_calc( float *match, float **cpmx1, float **cpmx2, int i1, int lgth2, float **floatwork, int **intwork, int initialize ) { int j, k, l; float scarr[26]; float **cpmxpd = floatwork; int **cpmxpdn = intwork; int count = 0; float *matchpt; float **cpmxpdpt; int **cpmxpdnpt; int cpkd; if( initialize ) { for( j=0; j -1 ) *fpt2 += scarr[*ipt++] * *fpt++; fpt2++,iptpt++,fptpt++; } } for( j=0; j-1; k++ ) match[j] += scarr[cpmxpdn[j][k]] * cpmxpd[j][k]; } #else matchpt = match; cpmxpdnpt = cpmxpdn; cpmxpdpt = cpmxpd; while( lgth2-- ) { *matchpt = 0.0; for( k=0; (cpkd=(*cpmxpdnpt)[k])>-1; k++ ) *matchpt += scarr[cpkd] * (*cpmxpdpt)[k]; matchpt++; cpmxpdnpt++; cpmxpdpt++; } #endif } static float Atracking( float *lasthorizontalw, float *lastverticalw, char **seq1, char **seq2, char **mseq1, char **mseq2, int **ijp, int icyc, int jcyc, int ist, int ien, int jst, int jen, int fulllen1, int fulllen2, int tailgp ) { int i, j, l, iin, jin, ifi, jfi, lgth1, lgth2, k, klim; char *gaptable1, *gt1bk; char *gaptable2, *gt2bk; float wm; lgth1 = ien-ist+1; lgth2 = jen-jst+1; gt1bk = AllocateCharVec( lgth1+lgth2+1 ); gt2bk = AllocateCharVec( lgth1+lgth2+1 ); #if 0 for( i=0; i= wm ) { wm = lastverticalw[i]; iin = i; jin = lgth2-1; ijp[lgth1][lgth2] = +( lgth1 - i ); } } for( j=0; j= wm ) { wm = lasthorizontalw[j]; iin = lgth1-1; jin = j; ijp[lgth1][lgth2] = -( lgth2 - j ); } } } #if 0 else if( jen == fulllen2-1 ) { fprintf( stderr, "searching lastverticalw\n" ); wm = lastverticalw[0]; for( i=0; i= wm ) { wm = lastverticalw[i]; iin = i; jin = lgth2-1; ijp[lgth1][lgth2] = +( lgth1 - i ); } } } else if( ien == fulllen1-1 ) { fprintf( stderr, "searching lasthorizontalw\n" ); wm = lasthorizontalw[0]; for( j=0; j= wm ) { wm = lasthorizontalw[j]; iin = lgth1-1; jin = j; ijp[lgth1][lgth2] = -( lgth2 - j ); } } } #endif for( i=0; i 0 ) { ifi = iin-ijp[iin][jin]; jfi = jin-1; } else { ifi = iin-1; jfi = jin-1; } l = iin - ifi; while( --l ) { *--gaptable1 = 'o'; *--gaptable2 = '-'; k++; } l= jin - jfi; while( --l ) { *--gaptable1 = '-'; *--gaptable2 = 'o'; k++; } if( iin <= 0 || jin <= 0 ) break; *--gaptable1 = 'o'; *--gaptable2 = 'o'; k++; iin = ifi; jin = jfi; } for( i=0; i", wm ); #endif g = mi + fgcp2[j-1]; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = -( j - mpi ); } g = *prept + ogcp2[j]; if( g >= mi ) { mi = g; mpi = j-1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif g = *mjpt + fgcp1[i-1]; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = +( i - *mpjpt ); } g = *prept + ogcp1[i]; if( g >= *mjpt ) { *mjpt = g; *mpjpt = i-1; } #if USE_PENALTY_EX m[j] += fpenalty_ex; #endif #if 0 fprintf( stderr, "%5.0f ", wm ); #endif *curpt += wm; ijppt++; mjpt++; prept++; mpjpt++; curpt++; } lastverticalw[i] = currentw[lgth2-1]; } // fprintf( stderr, "wm = %f\n", wm ); Atracking( currentw, lastverticalw, seq1, seq2, mseq1, mseq2, ijp, icyc, jcyc, ist, ien, jst, jen, fulllen1, fulllen2, tailgp ); #if 0 fprintf( stderr, "res in _tanni mseq1[0] = %s\n", mseq1[0] ); fprintf( stderr, "res in _tanni mseq2[0] = %s\n", mseq2[0] ); #endif // for( i=0; i", wm ); #endif g = mi + fgcp2[j-1]; // g = mi + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; // *ijppt = -( j - mpi ); } g = *prept + ogcp2[j]; // g = *prept; if( g >= mi ) { mi = g; mpi = j-1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif g = *mjpt + fgcp1[i-1]; // g = *mjpt + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; // *ijppt = +( i - *mpjpt ); } g = *prept + ogcp1[i]; // g = *prept; if( g >= *mjpt ) { *mjpt = g; *mpjpt = i-1; } #if USE_PENALTY_EX m[j] += fpenalty_ex; #endif #if 0 fprintf( stderr, "%5.0f ", wm ); #endif *curpt += wm; #if STOREWM WMMTX[i][j] = *curpt; WMMTX2[i][j] = *mjpt; #endif if( i == imid ) //muda { jumpbackj[j] = *mpjpt; // muda atode matomeru jumpbacki[j] = mpi; // muda atode matomeru // fprintf( stderr, "jumpbackj[%d] in forward dp is %d\n", j, *mpjpt ); // fprintf( stderr, "jumpbacki[%d] in forward dp is %d\n", j, mpi ); midw[j] = *curpt; midm[j] = *mjpt; midn[j] = mi; } // fprintf( stderr, "m[%d] = %f\n", j, m[j] ); mjpt++; prept++; mpjpt++; curpt++; } lastverticalw[i] = currentw[lgth2-1]; #if STOREWM WMMTX2[i][lgth2] = m[lgth2-1]; #endif #if 0 // ue if( i == imid ) { for( j=0; j0; --j ) { m[j-1] = currentw[j] + fgcp2[lgth2-2]; // m[j-1] = currentw[j]; mp[j] = lgth1-1; } // for( j=0; j=imid; i-- ) firstm = -9999999.9; // firstmp = lgth1-1; firstmp = lgth1; for( i=lgth1-2; i>-1; i-- ) { #ifdef enablemultithread // fprintf( stderr, "chudan = %d, %d\n", *chudanpt, chudanref ); if( chudanpt && *chudanpt != chudanref ) { // fprintf( stderr, "\n\n## CHUUDAN!!! kouhan\n" ); *chudanres = 1; freearrays_rec1 ( w1, w2, initverticalw, lastverticalw, midw, midm, midn, jumpbacki, jumpbackj, jumpforwi, jumpforwj, jumpdummi, jumpdummj, m, mp, floatwork, intwork #if STOREWM , WMMTX, WMMTX2 #endif ); freearrays_rec2( gaps, aseq1, aseq2 ); return( -1.0 ); } #endif wtmp = previousw; previousw = currentw; currentw = wtmp; previousw[lgth2-1] = initverticalw[i+1]; // match_calc( currentw, seq1, seq2, i, lgth2 ); match_calc( currentw, cpmx1+ist, cpmx2+jst, i, lgth2, floatwork, intwork, 0 ); currentw[lgth2-1] = initverticalw[i]; // m[lgth2] = fgcp1[i]; // WMMTX2[i][lgth2] += m[lgth2]; // fprintf( stderr, "m[] = %f\n", m[lgth2] ); mi = previousw[lgth2-1] + fgcp2[lgth2-2]; // mi = previousw[lgth2-1]; mpi = lgth2 - 1; mjpt = m + lgth2 - 2; prept = previousw + lgth2 - 1; curpt = currentw + lgth2 - 2; mpjpt = mp + lgth2 - 2; for( j=lgth2-2; j>-1; j-- ) { wm = *prept; ijpi = i+1; ijpj = j+1; g = mi + ogcp2[j+1]; // g = mi + fpenalty; if( g > wm ) { wm = g; ijpj = mpi; ijpi = i+1; } g = *prept + fgcp2[j]; // g = *prept; if( g >= mi ) { // fprintf( stderr, "i,j=%d,%d - renewed! mpi = %d\n", i, j, j+1 ); mi = g; mpi = j + 1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif // fprintf( stderr, "i,j=%d,%d *mpjpt = %d\n", i, j, *mpjpt ); g = *mjpt + ogcp1[i+1]; // g = *mjpt + fpenalty; if( g > wm ) { wm = g; ijpi = *mpjpt; ijpj = j+1; } // if( i == imid )fprintf( stderr, "i,j=%d,%d \n", i, j ); g = *prept + fgcp1[i]; // g = *prept; if( g >= *mjpt ) { *mjpt = g; *mpjpt = i + 1; } #if USE_PENALTY_EX m[j] += fpenalty_ex; #endif if( i == jumpi || i == imid - 1 ) { jumpforwi[j] = ijpi; //muda jumpforwj[j] = ijpj; //muda // fprintf( stderr, "jumpfori[%d] = %d\n", j, ijpi ); // fprintf( stderr, "jumpforj[%d] = %d\n", j, ijpj ); } if( i == imid ) // muda { midw[j] += wm; // midm[j+1] += *mjpt + fpenalty; //?????? midm[j+1] += *mjpt; //?????? } if( i == imid - 1 ) { // midn[j] += mi + fpenalty; //???? midn[j] += mi; //???? } #if STOREWM WMMTX[i][j] += wm; // WMMTX2[i][j+1] += *mjpt + fpenalty; WMMTX2[i][j+1] += *mjpt; #endif *curpt += wm; mjpt--; prept--; mpjpt--; curpt--; } // fprintf( stderr, "adding *mjpt (=%f) to WMMTX2[%d][%d]\n", *mjpt, i, j+1 ); g = *prept + fgcp1[i]; if( firstm < g ) { firstm = g; firstmp = i + 1; } #if STOREWM WMMTX2[i][j+1] += firstm; #endif if( i == imid ) midm[j+1] += firstm; if( i == imid - 1 ) { maxwm = midw[1]; jmid = 0; // if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); for( j=2; j maxwm ) { jmid = j; maxwm = wm; } // if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); } for( j=0; j maxwm ) { jmid = j; maxwm = wm; } // if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); } // if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); // fprintf( stderr, "### imid=%d, jmid=%d\n", imid, jmid ); wm = midw[jmid]; jumpi = imid-1; jumpj = jmid-1; if( jmid > 0 && midn[jmid-1] > wm ) //060413 { jumpi = imid-1; jumpj = jumpbacki[jmid]; wm = midn[jmid-1]; // fprintf( stderr, "rejump (n)\n" ); } if( midm[jmid] > wm ) { jumpi = jumpbackj[jmid]; jumpj = jmid-1; wm = midm[jmid]; // fprintf( stderr, "rejump (m) jumpi=%d\n", jumpi ); } // fprintf( stderr, "--> imid=%d, jmid=%d\n", imid, jmid ); // fprintf( stderr, "--> jumpi=%d, jumpj=%d\n", jumpi, jumpj ); #if STOREWM fprintf( stderr, "imid = %d\n", imid ); fprintf( stderr, "midn = \n" ); for( j=0; j 100 ) // naze 100 if( imid < firstmp-1 ) // naze 100 { jumpi = firstmp; imid = firstmp+1; } #if 0 else { jumpi = 0; imid = 1; } #endif #endif } #if 0 else if( jmid == lgth2 ) { fprintf( stderr, "CHUI1!\n" ); jumpi=0; jumpj=0; imid=jumpforwi[0]; jmid=lgth2-1; } #else // 060414 else if( jmid >= lgth2 ) { // fprintf( stderr, "CHUI1!\n" ); jumpi=imid-1; jmid=lgth2; jumpj = lgth2-1; } #endif else { // fprintf( stderr, "#### CHUI3!\n" ); imid = jumpforwi[jumpj]; jmid = jumpforwj[jumpj]; if( imid == jumpi ) jumpi = imid-1; } #if 0 fprintf( stderr, "jumpi -> %d\n", jumpi ); fprintf( stderr, "jumpj -> %d\n", jumpj ); fprintf( stderr, "imid -> %d\n", imid ); fprintf( stderr, "jmid -> %d\n", jmid ); #endif // fprintf( stderr, "#### FINAL i=%d, jumpi N ) { fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); ErrorExit( "LENGTH OVER!\n" ); } #endif #if 0 fprintf( stderr, "jumpi = %d, imid = %d\n", jumpi, imid ); fprintf( stderr, "jumpj = %d, jmid = %d\n", jumpj, jmid ); fprintf( stderr, "imid = %d\n", imid ); fprintf( stderr, "jmid = %d\n", jmid ); #endif freearrays_rec1 ( w1, w2, initverticalw, lastverticalw, midw, midm, midn, jumpbacki, jumpbackj, jumpforwi, jumpforwj, jumpdummi, jumpdummj, m, mp, floatwork, intwork #if STOREWM , WMMTX, WMMTX2 #endif ); // fprintf( stderr, "==== calling myself (first)\n" ); value = MSalignmm_rec( icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1, cpmx2, ist, ist+jumpi, jst, jst+jumpj, alloclen, fulllen1, fulllen2, aseq1, aseq2, depth, gapinfo, NULL, 0, NULL, headgp, tailgp ); // chudan mada #if 0 fprintf( stderr, "aseq1[0] = %s\n", aseq1[0] ); fprintf( stderr, "aseq2[0] = %s\n", aseq2[0] ); #endif #if MEMSAVE #else for( i=0; i 0 ) { for( i=0; i 0 ) { for( i=0; i 1 || maxwm - value > 1 ) { fprintf( stderr, "WARNING value = %f, but maxwm = %f\n", value, maxwm ); for( i=0; i1-%d\n%s\n", i, mseq1[i] ); fprintf( stderr, "%s\n", aseq1[i] ); } for( i=0; i2-%d\n%s\n", i, mseq2[i] ); fprintf( stderr, "%s\n", aseq2[i] ); } // exit( 1 ); } else { fprintf( stderr, "value = %.0f, maxwm = %.0f -> ok\n", value, maxwm ); } #endif #if MEMSAVE #else for( i=0; i%d of GROUP1\n", i ); fprintf( stdout, "%s\n", seq1[i] ); } for( i=0; i%d of GROUP2\n", i ); fprintf( stdout, "%s\n", seq2[i] ); } fflush( stdout ); #endif wm = MSalignmm_rec( icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1, cpmx2, 0, lgth1-1, 0, lgth2-1, alloclen, lgth1, lgth2, mseq1, mseq2, 0, gapinfo, chudanpt, chudanref, chudanres, headgp, tailgp ); #ifdef enablemultithread if( chudanres && *chudanres ) { // fprintf( stderr, "\n\n## CHUUDAN!!! relay\n" ); *chudanres = 1; freearrays( ogcp1, ogcp2, fgcp1, fgcp2, cpmx1, cpmx2, gapinfo, mseq1, mseq2 ); return( -1.0 ); } #endif #if DEBUG fprintf( stderr, " seq1[0] = %s\n", seq1[0] ); fprintf( stderr, " seq2[0] = %s\n", seq2[0] ); fprintf( stderr, "mseq1[0] = %s\n", mseq1[0] ); fprintf( stderr, "mseq2[0] = %s\n", mseq2[0] ); #endif // fprintf( stderr, "wm = %f\n", wm ); for( i=0; i