6 static void match_calc( float *match, float **cpmx1, float **cpmx2, int i1, int lgth2, float **floatwork, int **intwork, int initialize )
10 float **cpmxpd = floatwork;
11 int **cpmxpdn = intwork;
16 for( j=0; j<lgth2; j++ )
23 cpmxpd[count][j] = cpmx2[l][j];
24 cpmxpdn[count][j] = l;
28 cpmxpdn[count][j] = -1;
36 scarr[l] += n_dis[k][l] * cpmx1[k][i1];
38 for( j=0; j<lgth2; j++ )
41 for( k=0; cpmxpdn[k][j] > -1; k++ )
42 match[j] += scarr[cpmxpdn[k][j]] * cpmxpd[k][j];
46 static float Atracking( float *lasthorizontalw, float *lastverticalw,
47 char **seq1, char **seq2,
48 char **mseq1, char **mseq2,
49 float **cpmx1, float **cpmx2,
50 int **ijp, int icyc, int jcyc )
52 int i, j, k, l, iin, jin, ifi, jfi, lgth1, lgth2;
55 lgth1 = strlen( seq1[0] );
56 lgth2 = strlen( seq2[0] );
59 for( i=0; i<lgth1; i++ )
61 fprintf( stderr, "lastverticalw[%d] = %f\n", i, lastverticalw[i] );
69 wm = lastverticalw[0];
70 for( i=0; i<lgth1; i++ )
72 if( lastverticalw[i] >= wm )
74 wm = lastverticalw[i];
75 iin = i; jin = lgth2-1;
76 ijp[lgth1][lgth2] = +( lgth1 - i );
79 for( j=0; j<lgth2; j++ )
81 if( lasthorizontalw[j] >= wm )
83 wm = lasthorizontalw[j];
84 iin = lgth1-1; jin = j;
85 ijp[lgth1][lgth2] = -( lgth2 - j );
90 for( i=0; i<lgth1+1; i++ )
94 for( j=0; j<lgth2+1; j++ )
96 ijp[0][j] = -( j + 1 );
99 for( i=0; i<icyc; i++ )
101 mseq1[i] += lgth1+lgth2;
104 for( j=0; j<jcyc; j++ )
106 mseq2[j] += lgth1+lgth2;
109 iin = lgth1; jin = lgth2;
110 for( k=0; k<=lgth1+lgth2; k++ )
112 if( ijp[iin][jin] < 0 )
114 ifi = iin-1; jfi = jin+ijp[iin][jin];
116 else if( ijp[iin][jin] > 0 )
118 ifi = iin-ijp[iin][jin]; jfi = jin-1;
122 ifi = iin-1; jfi = jin-1;
127 for( i=0; i<icyc; i++ )
128 *--mseq1[i] = seq1[i][ifi+l];
129 for( j=0; j<jcyc; j++ )
136 for( i=0; i<icyc; i++ )
138 for( j=0; j<jcyc; j++ )
139 *--mseq2[j] = seq2[j][jfi+l];
142 if( iin <= 0 || jin <= 0 ) break;
143 for( i=0; i<icyc; i++ )
144 *--mseq1[i] = seq1[i][ifi];
145 for( j=0; j<jcyc; j++ )
146 *--mseq2[j] = seq2[j][jfi];
148 iin = ifi; jin = jfi;
154 float Aalign( char **seq1, char **seq2, double *eff1, double *eff2, int icyc, int jcyc, int alloclen )
155 /* score no keisan no sai motokaraaru gap no atukai ni mondai ga aru */
158 int lasti; /* outgap == 0 -> lgth1, outgap == 1 -> lgth1+1 */
161 float wm = 0.0; /* int ?????? */
167 static float *currentw;
168 static float *previousw;
170 static float *initverticalw; /* kufuu sureba iranai */
171 static float *lastverticalw; /* kufuu sureba iranai */
175 static float **cpmx1;
176 static float **cpmx2;
177 static int **intwork;
178 static float **floatwork;
179 static int orlgth1 = 0, orlgth2 = 0;
182 fprintf( stderr, "eff in SA+++align\n" );
183 for( i=0; i<icyc; i++ ) fprintf( stderr, "eff1[%d] = %f\n", i, eff1[i] );
187 mseq1 = AllocateCharMtx( njob, 1 );
188 mseq2 = AllocateCharMtx( njob, 1 ); /* by J. Thompson */
191 lgth1 = strlen( seq1[0] );
192 lgth2 = strlen( seq2[0] );
194 if( lgth1 > orlgth1 || lgth2 > orlgth2 )
198 if( orlgth1 > 0 && orlgth2 > 0 )
200 FreeFloatVec( currentw );
201 FreeFloatVec( previousw );
202 FreeFloatVec( match );
203 FreeFloatVec( initverticalw );
204 FreeFloatVec( lastverticalw );
211 FreeFloatMtx( cpmx1 );
212 FreeFloatMtx( cpmx2 );
214 FreeFloatMtx( floatwork );
215 FreeIntMtx( intwork );
218 ll1 = MAX( (int)(1.1*lgth1), orlgth1 ) + 100;
219 ll2 = MAX( (int)(1.1*lgth2), orlgth2 ) + 100;
221 fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 );
223 currentw = AllocateFloatVec( ll2+2 );
224 previousw = AllocateFloatVec( ll2+2 );
225 match = AllocateFloatVec( ll2+2 );
227 initverticalw = AllocateFloatVec( ll1+2 );
228 lastverticalw = AllocateFloatVec( ll1+2 );
230 m = AllocateFloatVec( ll2+2 );
231 mp = AllocateIntVec( ll2+2 );
233 mseq = AllocateCharMtx( njob, ll1+ll2 );
235 cpmx1 = AllocateFloatMtx( 26, ll1+2 );
236 cpmx2 = AllocateFloatMtx( 26, ll2+2 );
238 floatwork = AllocateFloatMtx( 26, MAX( ll1, ll2 )+2 );
239 intwork = AllocateIntMtx( 26, MAX( ll1, ll2 )+2 );
241 fprintf( stderr, "succeeded\n" );
247 for( i=0; i<icyc; i++ ) mseq1[i] = mseq[i];
248 for( j=0; j<jcyc; j++ ) mseq2[j] = mseq[icyc+j];
251 if( orlgth1 > commonAlloc1 || orlgth2 > commonAlloc2 )
255 if( commonAlloc1 && commonAlloc2 )
257 FreeIntMtx( commonIP );
260 ll1 = MAX( orlgth1, commonAlloc1 );
261 ll2 = MAX( orlgth2, commonAlloc2 );
263 fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 );
265 commonIP = AllocateIntMtx( ll1+10, ll2+10 );
267 fprintf( stderr, "succeeded\n\n" );
274 cpmx_calc( seq1, cpmx1, eff1, strlen( seq1[0] ), icyc );
275 cpmx_calc( seq2, cpmx2, eff2, strlen( seq2[0] ), jcyc );
277 match_calc( initverticalw, cpmx2, cpmx1, 0, lgth1, floatwork, intwork, 1 );
278 match_calc( currentw, cpmx1, cpmx2, 0, lgth2, floatwork, intwork, 1 );
282 for( i=1; i<lgth1+1; i++ )
284 initverticalw[i] += penalty * 0.5;
286 for( j=1; j<lgth2+1; j++ )
288 currentw[j] += penalty * 0.5;
292 for( j=0; j<lgth2+1; ++j )
294 m[j] = currentw[j-1] + penalty * 0.5; mp[j] = 0;
297 lastverticalw[0] = currentw[lgth2-1];
299 if( outgap ) lasti = lgth1+1; else lasti = lgth1;
301 for( i=1; i<lasti; i++ )
304 floatncpy( previousw, currentw, lgth2+1 );
305 previousw[0] = initverticalw[i-1];
307 match_calc( currentw, cpmx1, cpmx2, i, lgth2, floatwork, intwork, 0 );
308 currentw[0] = initverticalw[i];
310 mi = previousw[0] + penalty * 0.5; mpi = 0;
311 for( j=1; j<lgth2+1; j++ )
321 ijp[i][j] = -( j - mpi );
324 x = previousw[j-1] + g;
336 ijp[i][j] = +( i - mp[j] );
339 x = previousw[j-1] + g;
347 lastverticalw[i] = currentw[lgth2-1];
350 fprintf( stderr, "\n" );
351 for( i=0; i<icyc; i++ ) fprintf( stderr,"%s\n", seq1[i] );
352 fprintf( stderr, "#####\n" );
353 for( j=0; j<jcyc; j++ ) fprintf( stderr,"%s\n", seq2[j] );
354 fprintf( stderr, "====>" );
355 for( i=0; i<icyc; i++ ) strcpy( mseq1[i], seq1[i] );
356 for( j=0; j<jcyc; j++ ) strcpy( mseq2[j], seq2[j] );
358 Atracking( currentw, lastverticalw, seq1, seq2, mseq1, mseq2, cpmx1, cpmx2, ijp, icyc, jcyc );
360 resultlen = strlen( mseq1[0] );
361 if( alloclen < resultlen || resultlen > N )
363 fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N );
364 ErrorExit( "LENGTH OVER!\n" );
367 for( i=0; i<icyc; i++ ) strcpy( seq1[i], mseq1[i] );
368 for( j=0; j<jcyc; j++ ) strcpy( seq2[j], mseq2[j] );
370 fprintf( stderr, "\n" );
371 for( i=0; i<icyc; i++ ) fprintf( stderr, "%s\n", mseq1[i] );
372 fprintf( stderr, "#####\n" );
373 for( j=0; j<jcyc; j++ ) fprintf( stderr, "%s\n", mseq2[j] );