#include "mltaln.h" #include "dp.h" #define DEBUG 0 #define XXXXXXX 0 #define USE_PENALTY_EX 0 #define STOREWM 0 #define DPTANNI 50 static reccycle = 0; static void OpeningGapCount( float *ogcp, int clus, char **seq, double *eff ) { int i, j, gc, gb; int len = strlen( seq[0] ); float totaleff = 0.0; for( i=0; i -1 ) *fpt2 += scarr[*ipt++] * *fpt++; fpt2++,iptpt++,fptpt++; } } #else for( j=0; j-1; k++ ) match[j] += scarr[cpmxpdn[j][k]] * cpmxpd[j][k]; } #endif } static float Atracking( float *lasthorizontalw, float *lastverticalw, char **seq1, char **seq2, char **mseq1, char **mseq2, float **cpmx1, float **cpmx2, short **ijp, int icyc, int jcyc, int ist, int ien, int jst, int jen ) { int i, j, l, iin, jin, ifi, jfi, lgth1, lgth2, k, klim; char gap[] = "-"; float wm; lgth1 = ien-ist+1; lgth2 = jen-jst+1; #if 0 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 ) { for( i=0; i", wm ); #endif g = mi + fpenalty * fgcp2[j-1]; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = -( j - mpi ); } g = *prept + fpenalty * ogcp2[j]; if( g >= mi ) { mi = g; mpi = j-1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif g = *mjpt + fpenalty * fgcp1[i-1]; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = +( i - *mpjpt ); } g = *prept + fpenalty * 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]; } Atracking( currentw, lastverticalw, seq1, seq2, aseq1, aseq2, cpmx1+ist, cpmx2+jst, ijp, icyc, jcyc, ist, ien, jst, jen ); for( i=0; i", wm ); #endif g = mi + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; // *ijppt = -( j - mpi ); } // g = *prept + fpenalty * ogcp2[j]; g = *prept; if( g >= mi ) { mi = g; mpi = j-1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif // g = *mjpt + fpenalty * fgcp1[i-1]; g = *mjpt + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; // *ijppt = +( i - *mpjpt ); } // g = *prept + fpenalty * 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; } mjpt++; prept++; mpjpt++; curpt++; } lastverticalw[i] = currentw[lgth2-1]; #if 0 // ue if( i == imid ) { for( j=0; j0; --j ) { // m[j-1] = currentw[j] + fpenalty * fgcp2[lgth2-2]; m[j-1] = currentw[j]; mp[j] = lgth1-1; } // for( j=0; j=imid; i-- ) for( i=lgth1-2; i>-1; i-- ) { 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]; // mi = previousw[lgth2-1] + fpenalty * 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 + fpenalty * ogcp2[j+1]; g = mi + fpenalty; if( g > wm ) { wm = g; ijpj = mpi; } // g = *prept + fpenalty + 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 + fpenalty * ogcp1[i+1]; g = *mjpt + fpenalty; if( g > wm ) { wm = g; ijpi = *mpjpt; } // if( i == imid )fprintf( stderr, "i,j=%d,%d \n", i, j ); // g = *prept + fpenalty * 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; //?????? } if( i == imid - 1 ) { midn[j] += mi + fpenalty; //???? } #if STOREWM WMMTX[i][j] += wm; WMMTX2[i][j+1] += *mjpt + fpenalty; #endif *curpt += wm; mjpt--; prept--; mpjpt--; curpt--; } if( i == imid - 1 ) { maxwm = midw[1]; jmid = 1; for( j=2; j maxwm ) { jmid = j; maxwm = wm; } wm = midm[j]; if( wm > maxwm ) { jmid = j; maxwm = wm; } } // fprintf( stderr, "imid=%d, jmid=%d\n", imid, jmid ); wm = midw[jmid]; { jumpi = imid-1; jumpj = jmid-1; } if( midm[jmid] > wm ) { jumpi = jumpbackj[jmid]; jumpj = jmid-1; } if( midn[jmid-1] >= wm ) { jumpi = imid-1; jumpj = jumpbacki[jmid]; } #if 0 fprintf( stderr, "imid = %d\n", imid ); fprintf( stderr, "midn = \n" ); for( j=0; j %d\n", imid ); // fprintf( stderr, "jmid -> %d\n", jmid ); break; } } // fprintf( stderr, "imid = %d, but jumpi = %d\n", imid, jumpi ); // fprintf( stderr, "jmid = %d, but jumpj = %d\n", jmid, jumpj ); // for( j=0; j 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 FreeFloatVec( w1 ); FreeFloatVec( w2 ); FreeFloatVec( initverticalw ); FreeFloatVec( lastverticalw ); FreeFloatVec( midw ); FreeFloatVec( midm ); FreeFloatVec( midn ); FreeIntVec( jumpbacki ); FreeIntVec( jumpbackj ); FreeIntVec( jumpforwi ); FreeIntVec( jumpforwj ); FreeIntVec( jumpdummi ); FreeIntVec( jumpdummj ); FreeFloatVec( m ); FreeIntVec( mp ); FreeFloatMtx( floatwork ); FreeIntMtx( intwork ); #if STOREWM FreeFloatMtx( WMMTX ); FreeFloatMtx( WMMTX2 ); #endif // fprintf( stderr, "==== calling myself (first)\n" ); MSalignmm_rec( icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1, cpmx2, ist, ist+jumpi, jst, jst+jumpj, alloclen, aseq1, aseq2, depth, gapinfo ); for( i=0; i 0 ) { for( i=0; i 0 ) { 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, mseq1, mseq2, 0, gapinfo ); for( i=0; i