6 #define USE_PENALTY_EX 0
10 static void OpeningGapCount( double *ogcp, int clus, char **seq, double *eff )
13 int len = strlen( seq[0] );
14 double totaleff = 0.0;
16 for( i=0; i<len; i++ ) ogcp[i] = 0.0;
17 for( j=0; j<clus; j++ )
20 for( i=0; i<len; i++ )
23 gc = ( seq[j][i] == '-' );
25 if( !gb * gc ) ogcp[i] += eff[j];
30 for( i=0; i<len; i++ )
34 static void FinalGapCount( double *fgcp, int clus, char **seq, double *eff )
37 int len = strlen( seq[0] );
38 double totaleff = 0.0;
40 for( i=0; i<len; i++ ) fgcp[i] = 0.0;
41 for( j=0; j<clus; j++ )
43 gc = ( seq[j][0] == '-' );
44 for( i=1; i<len+1; i++ )
47 gc = ( seq[j][i] == '-' );
49 if( gb * !gc ) fgcp[i-1] += eff[j];
54 for( i=0; i<len; i++ )
58 static void match_calc( float *match, float **cpmx1, float **cpmx2, int i1, int lgth2, float **floatwork, int **intwork, int initialize )
62 float **cpmxpd = floatwork;
63 int **cpmxpdn = intwork;
68 for( j=0; j<lgth2; j++ )
75 cpmxpd[j][count] = cpmx2[j][l];
76 cpmxpdn[j][count] = l;
80 cpmxpdn[j][count] = -1;
89 scarr[l] += n_dis[k][l] * cpmx1[i1][k];
92 #if 0 /* ¤³¤ì¤ò»È¤¦¤È¤
\ad¤Ïfloatwork¤Î¥¢¥í¥±¡¼¥È¤òµÕ¤Ë¤¹¤ë */
94 float *fpt, **fptpt, *fpt2;
102 ipt=*iptpt,fpt=*fptpt;
104 *fpt2 += scarr[*ipt++] * *fpt++;
105 fpt2++,iptpt++,fptpt++;
109 for( j=0; j<lgth2; j++ )
112 for( k=0; cpmxpdn[j][k]>-1; k++ )
113 match[j] += scarr[cpmxpdn[j][k]] * cpmxpd[j][k];
118 static float Atracking( float *lasthorizontalw, float *lastverticalw,
119 char **seq1, char **seq2,
120 char **mseq1, char **mseq2,
121 float **cpmx1, float **cpmx2,
122 short **ijp, int icyc, int jcyc,
123 int ist, int ien, int jst, int jen )
125 int i, j, l, iin, jin, ifi, jfi, lgth1, lgth2, k, klim;
132 for( i=0; i<lgth1; i++ )
134 fprintf( stderr, "lastverticalw[%d] = %f\n", i, lastverticalw[i] );
138 for( i=0; i<lgth1+1; i++ )
142 for( j=0; j<lgth2+1; j++ )
144 ijp[0][j] = -( j + 1 );
147 for( i=0; i<icyc; i++ )
149 mseq1[i] += lgth1+lgth2;
152 for( j=0; j<jcyc; j++ )
154 mseq2[j] += lgth1+lgth2;
157 iin = lgth1; jin = lgth2;
159 for( k=0; k<=klim; k++ )
161 if( ijp[iin][jin] < 0 )
163 ifi = iin-1; jfi = jin+ijp[iin][jin];
165 else if( ijp[iin][jin] > 0 )
167 ifi = iin-ijp[iin][jin]; jfi = jin-1;
171 ifi = iin-1; jfi = jin-1;
176 for( i=0; i<icyc; i++ )
177 *--mseq1[i] = seq1[i][ist+ifi+l];
178 for( j=0; j<jcyc; j++ )
185 for( i=0; i<icyc; i++ )
187 for( j=0; j<jcyc; j++ )
188 *--mseq2[j] = seq2[j][jst+jfi+l];
191 if( iin <= 0 || jin <= 0 ) break;
192 for( i=0; i<icyc; i++ )
193 *--mseq1[i] = seq1[i][ist+ifi];
194 for( j=0; j<jcyc; j++ )
195 *--mseq2[j] = seq2[j][jst+jfi];
197 iin = ifi; jin = jfi;
199 fprintf( stderr, "in Atracking, mseq1 = %s, mseq2 = %s\n", mseq1[0], mseq2[0] );
201 fprintf( stderr, "in Atracking (owari), mseq1 = %s, mseq2 = %s\n", mseq1[0], mseq2[0] );
205 static float MSalignmm_tanni( int icyc, int jcyc, double *eff1, double *eff2, char **seq1, char **seq2, float **cpmx1, float **cpmx2, int ist, int ien, int jst, int jen, int alloclen, char **mseq1, char **mseq2 )
206 /* score no keisan no sai motokaraaru gap no atukai ni mondai ga aru */
213 float wm; /* int ?????? */
215 float *currentw, *previousw;
216 float fpenalty = (float)penalty;
217 float fpenalty_ex = (float)penalty_ex;
221 float *mjpt, *prept, *curpt;
229 float *initverticalw; /* kufuu sureba iranai */
230 float *lastverticalw; /* kufuu sureba iranai */
237 static char **aseq1 = NULL;
238 static char **aseq2 = NULL;
239 static char **aseq1bk, **aseq2bk;
243 aseq1 = AllocateCharMtx( icyc, 0 );
244 aseq2 = AllocateCharMtx( jcyc, 0 );
250 fprintf( stderr, "seq1[0]+ist = %s\n", seq1[0]+ist );
251 fprintf( stderr, "seq2[0]+jst = %s\n", seq2[0]+jst );
253 fprintf( stderr, "ist,ien = %d,%d, lgth1=%d\n", ist, ien, lgth1 );
254 fprintf( stderr, "jst,jen = %d,%d, lgth2=%d\n", jst, jen, lgth2 );
257 ll1 = ( (int)(1.3*lgth1) ) + 100;
258 ll2 = ( (int)(1.3*lgth2) ) + 100;
260 aseq1bk = AllocateCharMtx( icyc, lgth1+lgth2+100 );
261 aseq2bk = AllocateCharMtx( jcyc, lgth1+lgth2+100 );
262 for( i=0; i<icyc; i++ ) aseq1[i] = aseq1bk[i];
263 for( i=0; i<jcyc; i++ ) aseq2[i] = aseq2bk[i];
265 w1 = AllocateFloatVec( ll2+2 );
266 w2 = AllocateFloatVec( ll2+2 );
267 match = AllocateFloatVec( ll2+2 );
269 initverticalw = AllocateFloatVec( ll1+2 );
270 lastverticalw = AllocateFloatVec( ll1+2 );
272 m = AllocateFloatVec( ll2+2 );
273 mp = AllocateIntVec( ll2+2 );
275 floatwork = AllocateFloatMtx( MAX( ll1, ll2 )+2, 26 );
276 intwork = AllocateIntMtx( MAX( ll1, ll2 )+2, 26 );
279 shortmtx = AllocateShortMtx( ll1, ll2 );
280 WMMTX = AllocateFloatMtx( ll1, ll2 );
287 fprintf( stderr, "calling match_calc\n" );
288 match_calc( initverticalw, cpmx2+jst, cpmx1+ist, 0, lgth1, floatwork, intwork, 1 );
290 match_calc( currentw, cpmx1+ist, cpmx2+jst, 0, lgth2, floatwork, intwork, 1 );
292 WMMTX[0][0] = initverticalw[0];
293 for( i=1; i<lgth1+1; i++ )
295 initverticalw[i] += fpenalty;
296 WMMTX[i][0] = initverticalw[i];
298 for( j=1; j<lgth2+1; j++ )
300 currentw[j] += fpenalty;
301 WMMTX[0][j] = currentw[j];
304 for( j=1; j<lgth2+1; ++j )
306 m[j] = currentw[j-1];
309 lastverticalw[0] = currentw[lgth2-1];
311 fprintf( stderr, "entering to loop\n" );
314 for( i=1; i<lasti; i++ )
317 fprintf( stderr, "i=%d\n", i );
319 previousw = currentw;
322 previousw[0] = initverticalw[i-1];
324 fprintf( stderr, "calling match_calc, ist=%d, lgth2=%d\n", ist, lgth2 );
325 match_calc( currentw, cpmx1+ist, cpmx2+jst, i, lgth2, floatwork, intwork, 0 );
326 fprintf( stderr, "done\n" );
327 currentw[0] = initverticalw[i];
329 mi = previousw[0]; mpi = 0;
334 curpt = currentw + 1;
337 for( j=1; j<lastj; j++ )
339 fprintf( stderr, "j=%d\n", j );
344 fprintf( stderr, "%5.0f->", wm );
348 fprintf( stderr, "%5.0f?", g );
353 *ijppt = -( j - mpi );
365 g = *mjpt + fpenalty;
367 fprintf( stderr, "%5.0f?", g );
372 *ijppt = +( i - *mpjpt );
385 fprintf( stderr, "%5.0f ", wm );
389 WMMTX[i][j] = *curpt;
396 fprintf( stderr, "j=%d end\n", j );
398 lastverticalw[i] = currentw[lgth2-1];
399 fprintf( stderr, "i=%d end\n", i );
403 for( i=0; i<lgth1; i++ )
405 for( j=0; j<lgth2; j++ )
407 fprintf( stderr, "% 10.2f ", WMMTX[i][j] );
409 fprintf( stderr, "\n" );
411 fprintf( stderr, "\n" );
414 Atracking( currentw, lastverticalw, seq1, seq2, aseq1, aseq2, cpmx1+ist, cpmx2+jst, ijp, icyc, jcyc, ist, ien, jst, jen );
416 for( i=0; i<icyc; i++ ) strcpy( mseq1[i], aseq1[i] );
417 for( i=0; i<jcyc; i++ ) strcpy( mseq2[i], aseq2[i] );
419 fprintf( stderr, "in _tanni, aseq1 = %s\n", aseq1[0] );
420 fprintf( stderr, "in _tanni, mseq1 = %s\n", mseq1[0] );
424 FreeFloatVec( match );
425 FreeFloatVec( initverticalw );
426 FreeFloatVec( lastverticalw );
432 FreeFloatMtx( floatwork );
433 FreeIntMtx( intwork );
435 FreeShortMtx( shortmtx );
436 FreeFloatMtx( WMMTX );
438 FreeCharMtx( aseq1bk );
439 FreeCharMtx( aseq2bk );
444 static float MSalignmm_rec( int icyc, int jcyc, double *eff1, double *eff2, char **seq1, char **seq2, float **cpmx1, float **cpmx2, int ist, int ien, int jst, int jen, int alloclen, char **mseq1, char **mseq2, int depth )
445 /* score no keisan no sai motokaraaru gap no atukai ni mondai ga aru */
449 char **aseq1, **aseq2;
451 int lasti, lastj, imid, jmid;
453 float wm; /* int ?????? */
455 float *currentw, *previousw;
456 float fpenalty = (float)penalty;
457 float fpenalty_ex = (float)penalty_ex;
461 float *mjpt, *prept, *curpt;
469 float *initverticalw; /* kufuu sureba iranai */
470 float *lastverticalw; /* kufuu sureba iranai */
484 fprintf( stderr, "==== MSalign (%d), ist=%d, ien=%d, jst=%d, jen=%d\n", depth, ist, ien, jst, jen );
487 fprintf( stderr, "==== Jimei\n" );
488 for( i=0; i<icyc; i++ )
490 strncpy( mseq1[i], seq1[i]+ist, lgth1 );
493 for( i=0; i<jcyc; i++ )
496 for( j=0; j<lgth1; j++ )
497 strcat( mseq2[i], "-" );
500 fprintf( stderr, "==== mseq1[0] (%d) = %s\n", depth, mseq1[0] );
501 fprintf( stderr, "==== mseq2[0] (%d) = %s\n", depth, mseq2[0] );
503 return( (float)offset * lgth1 );
507 aseq1 = AllocateCharMtx( icyc, lgth1+lgth2+100 );
508 aseq2 = AllocateCharMtx( jcyc, lgth1+lgth2+100 );
510 if( lgth1 < DPTANNI )
512 fprintf( stderr, "==== Going to _tanni\n" );
513 wm = MSalignmm_tanni( icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1, cpmx2, ist, ien, jst, jen, alloclen, aseq1, aseq2 );
516 for( i=0; i<icyc; i++ ) strcpy( mseq1[i], aseq1[i] );
517 for( i=0; i<jcyc; i++ ) strcpy( mseq2[i], aseq2[i] );
519 fprintf( stderr, "==== mseq1[0] (%d) = %s\n", depth, mseq1[0] );
520 fprintf( stderr, "==== mseq2[0] (%d) = %s\n", depth, mseq2[0] );
522 fprintf( stderr, "freeing aseq\n" );
523 FreeCharMtx( aseq1 );
524 FreeCharMtx( aseq2 );
528 fprintf( stderr, "Trying to divide the mtx\n" );
531 ll1 = ( (int)(1.3*lgth1) ) + 100;
532 ll2 = ( (int)(1.3*lgth2) ) + 100;
534 fprintf( stderr, "ll1,ll2=%d,%d\n", ll1, ll2 );
536 w1 = AllocateFloatVec( ll2+2 );
537 w2 = AllocateFloatVec( ll2+2 );
538 match = AllocateFloatVec( ll2+2 );
540 initverticalw = AllocateFloatVec( ll1+2 );
541 lastverticalw = AllocateFloatVec( ll1+2 );
543 m = AllocateFloatVec( ll2+2 );
544 mp = AllocateIntVec( ll2+2 );
546 floatwork = AllocateFloatMtx( MAX( ll1, ll2 )+2, 26 );
547 intwork = AllocateIntMtx( MAX( ll1, ll2 )+2, 26 );
550 fprintf( stderr, "succeeded\n" );
555 fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 );
558 shortmtx = AllocateShortMtx( ll1, ll2 );
559 WMMTX = AllocateFloatMtx( ll1, ll2 );
562 fprintf( stderr, "succeeded\n\n" );
570 match_calc( initverticalw, cpmx2+jst, cpmx1+ist, 0, lgth1, floatwork, intwork, 1 );
572 match_calc( currentw, cpmx1+ist, cpmx2+jst, 0, lgth2, floatwork, intwork, 1 );
574 WMMTX[0][0] = initverticalw[0];
575 for( i=1; i<lgth1+1; i++ )
577 initverticalw[i] += fpenalty;
578 WMMTX[i][0] = initverticalw[i];
580 for( j=1; j<lgth2+1; j++ )
582 currentw[j] += fpenalty;
583 WMMTX[0][j] = currentw[j];
586 for( j=1; j<lgth2+1; ++j )
588 m[j] = currentw[j-1];
591 lastverticalw[0] = currentw[lgth2-1];
596 // for( i=1; i<lasti; i++ )
597 for( i=1; i<=imid; i++ )
600 previousw = currentw;
603 previousw[0] = initverticalw[i-1];
605 match_calc( currentw, cpmx1+ist, cpmx2+jst, i, lgth2, floatwork, intwork, 0 );
606 currentw[0] = initverticalw[i];
608 mi = previousw[0]; mpi = 0;
613 curpt = currentw + 1;
616 for( j=1; j<lastj; j++ )
622 fprintf( stderr, "%5.0f->", wm );
626 fprintf( stderr, "%5.0f?", g );
631 *ijppt = -( j - mpi );
643 g = *mjpt + fpenalty;
645 fprintf( stderr, "%5.0f?", g );
650 *ijppt = +( i - *mpjpt );
663 fprintf( stderr, "%5.0f ", wm );
667 WMMTX[i][j] = *curpt;
675 lastverticalw[i] = currentw[lgth2-1];
679 for( i=0; i<lgth1; i++ )
681 for( j=0; j<lgth2; j++ )
683 fprintf( stderr, "% 10.2f ", WMMTX[i][j] );
685 fprintf( stderr, "\n" );
687 fprintf( stderr, "\n" );
692 match_calc( initverticalw, cpmx2+jst, cpmx1+ist, lgth2-1, lgth1, floatwork, intwork, 1 );
693 match_calc( currentw, cpmx1+ist, cpmx2+jst, lgth1-1, lgth2, floatwork, intwork, 1 );
695 for( i=0; i<lgth1-1; i++ )
697 initverticalw[i] += fpenalty;
698 WMMTX[i][lgth2-1] += fpenalty;
700 for( j=0; j<lgth2-1; j++ )
702 currentw[j] += fpenalty;
703 WMMTX[lgth1-1][j] += fpenalty;
706 for( j=lgth2-1; j>0; --j )
708 m[j-1] = currentw[j];
711 // for( j=0; j<lgth2; j++ ) m[j] = 0.0;
712 // m[lgth2-1] ha irunoka?
714 for( i=lgth1-2; i>=imid; i-- )
715 // for( i=lgth1-2; i>-1; i-- )
718 previousw = currentw;
720 previousw[lgth2-1] = initverticalw[i+1];
721 // match_calc( currentw, seq1, seq2, i, lgth2 );
722 match_calc( currentw, cpmx1+ist, cpmx2+jst, i, lgth2, floatwork, intwork, 0 );
724 currentw[lgth2-1] = initverticalw[i];
726 mi = previousw[lgth2-1];
728 mjpt = m + lgth2 - 2;
729 prept = previousw + lgth2 - 1;
730 curpt = currentw + lgth2 - 2;
731 mpjpt = mp + lgth2 - 2;
733 for( j=lgth2-2; j>-1; j-- )
740 if( g >= mi ) mi = g;
746 g = *mjpt + fpenalty;
750 if( g >= *mjpt ) *mjpt = g;
767 for( i=0; i<lgth1; i++ )
769 for( j=0; j<lgth2; j++ )
771 fprintf( stderr, "% 10.2f ", WMMTX[i][j] );
773 fprintf( stderr, "\n" );
777 // Atracking( currentw, lastverticalw, seq1, seq2, mseq1, mseq2, cpmx1, cpmx2, ijp, icyc, jcyc );
780 resultlen = strlen( mseq1[0] );
781 if( alloclen < resultlen || resultlen > N )
783 fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N );
784 ErrorExit( "LENGTH OVER!\n" );
789 maxwm = -999999999.9;
791 for( j=0; j<lgth2; j++ )
800 // gap no tochu de kirrareru kanousei ari.
802 fprintf( stderr, "wm = %f\n", wm );
803 fprintf( stderr, "imid = %d\n", imid );
804 fprintf( stderr, "jmid = %d\n", jmid );
808 FreeFloatVec( match );
809 FreeFloatVec( initverticalw );
810 FreeFloatVec( lastverticalw );
815 FreeFloatMtx( floatwork );
816 FreeIntMtx( intwork );
818 FreeShortMtx( shortmtx );
819 FreeFloatMtx( WMMTX );
822 fprintf( stderr, "==== calling myself (first)\n" );
823 MSalignmm_rec( icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1, cpmx2, ist, ist+imid, jst, jst+jmid, alloclen, aseq1, aseq2, depth );
824 for( i=0; i<icyc; i++ ) strcpy( mseq1[i], aseq1[i] );
825 for( i=0; i<jcyc; i++ ) strcpy( mseq2[i], aseq2[i] );
827 fprintf( stderr, "====(f) aseq1[0] (%d) = %s (%d-%d)\n", depth, aseq1[0], ist, ien );
828 fprintf( stderr, "====(f) aseq2[0] (%d) = %s (%d-%d)\n", depth, aseq2[0], jst, jen );
831 fprintf( stderr, "==== calling myself (second)\n" );
832 MSalignmm_rec( icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1, cpmx2, ist+imid+1, ien, jst+jmid+1, jen, alloclen, aseq1, aseq2, depth );
834 for( i=0; i<icyc; i++ ) strcat( mseq1[i], aseq1[i] );
835 for( i=0; i<jcyc; i++ ) strcat( mseq2[i], aseq2[i] );
837 fprintf( stderr, "====(s) aseq1[0] (%d) = %s (%d-%d)\n", depth, aseq1[0], ist, ien );
838 fprintf( stderr, "====(s) aseq2[0] (%d) = %s (%d-%d)\n", depth, aseq2[0], jst, jen );
840 fprintf( stderr, "==== mseq1[0] (%d) = %s\n", depth, mseq1[0] );
841 fprintf( stderr, "==== mseq2[0] (%d) = %s\n", depth, mseq2[0] );
843 FreeCharMtx( aseq1 );
844 FreeCharMtx( aseq2 );
851 float MSalignmm( char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen )
852 /* score no keisan no sai motokaraaru gap no atukai ni mondai ga aru */
858 float wm; /* int ?????? */
859 static char **mseq1 = NULL;
860 static char **mseq2 = NULL;
870 fprintf( stderr, "eff in SA+++align\n" );
871 for( i=0; i<icyc; i++ ) fprintf( stderr, "eff1[%d] = %f\n", i, eff1[i] );
875 mseq1 = AllocateCharMtx( njob, 0 );
876 mseq2 = AllocateCharMtx( njob, 0 );
882 lgth1 = strlen( seq1[0] );
883 lgth2 = strlen( seq2[0] );
885 ll1 = ( (int)(1.3*lgth1) ) + 100;
886 ll2 = ( (int)(1.3*lgth2) ) + 100;
888 mseq = AllocateCharMtx( njob, ll1+ll2 );
890 ogcp1 = AllocateDoubleVec( ll1+2 );
891 ogcp2 = AllocateDoubleVec( ll2+2 );
892 fgcp1 = AllocateDoubleVec( ll1+2 );
893 fgcp2 = AllocateDoubleVec( ll2+2 );
895 cpmx1 = AllocateFloatMtx( ll1+2, 26 );
896 cpmx2 = AllocateFloatMtx( ll2+2, 26 );
898 for( i=0; i<icyc; i++ ) mseq1[i] = mseq[i];
899 for( j=0; j<jcyc; j++ ) mseq2[j] = mseq[icyc+j];
902 MScpmx_calc_new( seq1, cpmx1, eff1, strlen( seq1[0] ), icyc );
903 MScpmx_calc_new( seq2, cpmx2, eff2, strlen( seq2[0] ), jcyc );
906 OpeningGapCount( ogcp1, icyc, seq1, eff1 );
907 OpeningGapCount( ogcp2, jcyc, seq2, eff2 );
908 FinalGapCount( fgcp1, icyc, seq1, eff1 );
909 FinalGapCount( fgcp2, jcyc, seq2, eff2 );
911 for( i=0; i<lgth1; i++ )
913 ogcp1[i] = 1.0 - ogcp1[i];
914 fgcp1[i] = 1.0 - fgcp1[i];
916 for( i=0; i<lgth2; i++ )
918 ogcp2[i] = 1.0 - ogcp2[i];
919 fgcp2[i] = 1.0 - fgcp2[i];
923 wm = MSalignmm_rec( icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1, cpmx2, 0, lgth1-1, 0, lgth2-1, alloclen, mseq1, mseq2, 0 );
925 for( i=0; i<icyc; i++ ) strcpy( seq1[i], mseq1[i] );
926 for( i=0; i<jcyc; i++ ) strcpy( seq2[i], mseq2[i] );
929 FreeDoubleVec( ogcp1 );
930 FreeDoubleVec( ogcp2 );
931 FreeDoubleVec( fgcp1 );
932 FreeFloatMtx( cpmx1 );
933 FreeFloatMtx( cpmx2 );
934 FreeDoubleVec( fgcp2 );