comparison 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
comparison
equal deleted inserted replaced
17:836fa4fe9494 18:e4d75f9efb90
1 #include "mltaln.h"
2
3 #define DEBUG 0
4
5 #if 0
6 void mdfymtx( char pair[njob][njob], int s1, double **partialmtx, double **mtx )
7 #else
8 void mdfymtx( char **pair, int s1, double **partialmtx, double **mtx )
9 #endif
10 {
11 int i, j;
12 int icount, jcount;
13 #if DEBUG
14 FILE *fp;
15 static char name[M][B];
16
17 for( i=0; i<M; i++ ) name[i][0] = 0;
18 fprintf( stdout, "s1 = %d\n", s1 );
19 for( i=0; i<njob; i++ )
20 {
21 for( j=0; j<njob; j++ )
22 {
23 printf( "%#2d", pair[i][j] );
24 }
25 printf( "\n" );
26 }
27 #endif
28
29 for( i=0, icount=0; i<njob-1; i++ )
30 {
31 if( !pair[s1][i] ) continue;
32 for( j=i+1, jcount=icount+1; j<njob; j++ )
33 {
34 if( !pair[s1][j] ) continue;
35 partialmtx[icount][jcount] = mtx[i][j];
36 jcount++;
37 }
38 icount++;
39 }
40 #if DEBUG
41 fp = fopen( "hat2.org", "w" );
42 WriteHat2( fp, njob, name, mtx );
43 fclose( fp );
44 fp = fopen( "hat2.mdf", "w" );
45 WriteHat2( fp, icount, name, partialmtx );
46 fclose( fp );
47 #endif
48
49 }
50
51
52 float score_calc( char **seq, int s ) /* method 3 */
53 {
54 int i, j, k, c;
55 int len = strlen( seq[0] );
56 float score;
57 int tmpscore;
58 char *mseq1, *mseq2;
59
60 score = 0.0;
61 for( i=0; i<s-1; i++ )
62 {
63 for( j=i+1; j<s; j++ )
64 {
65 mseq1 = seq[i];
66 mseq2 = seq[j];
67 tmpscore = 0;
68 c = 0;
69 for( k=0; k<len; k++ )
70 {
71 if( mseq1[k] == '-' && mseq2[k] == '-' ) continue;
72 c++;
73 tmpscore += amino_dis[(int)mseq1[k]][(int)mseq2[k]];
74 if( mseq1[k] == '-' )
75 {
76 tmpscore += penalty;
77 while( mseq1[++k] == '-' )
78 ;
79 k--;
80 if( k > len-2 ) break;
81 continue;
82 }
83 if( mseq2[k] == '-' )
84 {
85 tmpscore += penalty;
86 while( mseq2[++k] == '-' )
87 ;
88 k--;
89 if( k > len-2 ) break;
90 continue;
91 }
92 }
93 /*
94 if( mseq1[0] == '-' || mseq2[0] == '-' )
95 {
96 for( k=0; k<len; k++ )
97 {
98 if( mseq1[k] == '-' && mseq2[k] == '-' ) continue;
99 if( !( mseq1[k] != '-' && mseq2[k] != '-' ) )
100 {
101 c--;
102 tmpscore -= penalty;
103 break;
104 }
105 else break;
106 }
107 }
108 if( mseq1[len-1] == '-' || mseq2[len-1] == '-' )
109 {
110 for( k=0; k<len; k++ )
111 {
112 if( mseq1[k] == '-' && mseq2[k] == '-' ) continue;
113 if( !( mseq1[k] != '-' && mseq2[k] != '-' ) )
114 {
115 c--;
116 tmpscore -= penalty;
117 break;
118 }
119 else break;
120 }
121 }
122 */
123 score += (double)tmpscore / (double)c;
124 }
125 }
126 score = (float)score / ( ( (double)s * ((double)s-1.0) ) / 2.0 );
127 fprintf( stderr, "score in score_calc = %f\n", score );
128 return( score );
129 }
130
131 void cpmx_calc( char **seq, float **cpmx, double *eff, int lgth, int clus )
132 {
133 int i, j, k;
134 double totaleff = 0.0;
135
136 for( i=0; i<clus; i++ ) totaleff += eff[i];
137 for( i=0; i<nalphabets; i++ ) for( j=0; j<lgth; j++ ) cpmx[i][j] = 0.0;
138 for( j=0; j<lgth; j++ ) for( k=0; k<clus; k++ )
139 cpmx[(int)amino_n[(int)seq[k][j]]][j] += (float)eff[k] / totaleff;
140 }
141
142
143 void cpmx_calc_new_bk( char **seq, float **cpmx, double *eff, int lgth, int clus ) // summ eff must be 1.0
144 {
145 int i, j, k;
146 float feff;
147
148 for( i=0; i<nalphabets; i++ ) for( j=0; j<lgth; j++ ) cpmx[i][j] = 0.0;
149 for( k=0; k<clus; k++ )
150 {
151 feff = (float)eff[k];
152 for( j=0; j<lgth; j++ )
153 {
154 cpmx[(int)amino_n[(int)seq[k][j]]][j] += feff;
155 }
156 }
157 }
158
159 void cpmx_calc_new( char **seq, float **cpmx, double *eff, int lgth, int clus ) // summ eff must be 1.0
160 {
161 int i, j, k;
162 float feff;
163 float *cpmxpt, **cpmxptpt;
164 char *seqpt;
165
166 j = nalphabets;
167 cpmxptpt = cpmx;
168 while( j-- )
169 {
170 cpmxpt = *cpmxptpt++;
171 i = lgth;
172 while( i-- )
173 *cpmxpt++ = 0.0;
174 }
175 for( k=0; k<clus; k++ )
176 {
177 feff = (float)eff[k];
178 seqpt = seq[k];
179 // fprintf( stderr, "seqpt = %s, lgth=%d\n", seqpt, lgth );
180 for( j=0; j<lgth; j++ )
181 {
182 cpmx[(int)amino_n[(int)*seqpt++]][j] += feff;
183 }
184 }
185 }
186 void MScpmx_calc_new( char **seq, float **cpmx, double *eff, int lgth, int clus ) // summ eff must be 1.0
187 {
188 int i, j, k;
189 float feff;
190 float **cpmxptpt, *cpmxpt;
191 char *seqpt;
192
193 j = lgth;
194 cpmxptpt = cpmx;
195 while( j-- )
196 {
197 cpmxpt = *cpmxptpt++;
198 i = nalphabets;
199 while( i-- )
200 *cpmxpt++ = 0.0;
201 }
202 for( k=0; k<clus; k++ )
203 {
204 feff = (float)eff[k];
205 seqpt = seq[k];
206 cpmxptpt = cpmx;
207 j = lgth;
208 while( j-- )
209 (*cpmxptpt++)[(int)amino_n[(int)*seqpt++]] += feff;
210 }
211 #if 0
212 for( j=0; j<lgth; j++ ) for( i=0; i<nalphabets; i++ ) cpmx[j][i] = 0.0;
213 for( k=0; k<clus; k++ )
214 {
215 feff = (float)eff[k];
216 for( j=0; j<lgth; j++ )
217 cpmx[j][(int)amino_n[(int)seq[k][j]]] += feff;
218 }
219 #endif
220 }
221
222 void cpmx_ribosum( char **seq, char **seqr, char *dir, float **cpmx, double *eff, int lgth, int clus ) // summ eff must be 1.0
223 {
224 int i, j, k;
225 float feff;
226 float **cpmxptpt, *cpmxpt;
227 char *seqpt, *seqrpt, *dirpt;
228 int code, code1, code2;
229
230 j = lgth;
231 cpmxptpt = cpmx;
232 while( j-- )
233 {
234 cpmxpt = *cpmxptpt++;
235 i = 37;
236 while( i-- )
237 *cpmxpt++ = 0.0;
238 }
239 for( k=0; k<clus; k++ )
240 {
241 feff = (float)eff[k];
242 seqpt = seq[k];
243 seqrpt = seqr[k];
244 dirpt = dir;
245 cpmxptpt = cpmx;
246 j = lgth;
247 while( j-- )
248 {
249 #if 0
250 code1 = amino_n[(int)*seqpt];
251 if( code1 > 3 ) code = 36;
252 else
253 code = code1;
254 #else
255 code1 = amino_n[(int)*seqpt];
256 code2 = amino_n[(int)*seqrpt];
257 if( code1 > 3 )
258 {
259 code = 36;
260 }
261 else if( code2 > 3 )
262 {
263 code = code1;
264 }
265 else if( *dirpt == '5' )
266 {
267 code = 4 + code2 * 4 + code1;
268 }
269 else if( *dirpt == '3' )
270 {
271 code = 20 + code2 * 4 + code1;
272 }
273 else // if( *dirpt == 'o' ) // nai
274 {
275 code = code1;
276 }
277 #endif
278
279 // 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 );
280
281 seqpt++;
282 seqrpt++;
283 dirpt++;
284
285 (*cpmxptpt++)[code] += feff;
286 }
287 }
288 }
289
290 void mseqcat( char **seq1, char **seq2, double **eff, double *effarr1, double *effarr2, char name1[M][B], char name2[M][B], int clus1, int clus2 )
291 {
292 int i, j;
293 for( i=0; i<clus2; i++ )
294 seq1[clus1+i] = seq2[i];
295 for( i=0; i<clus2; i++ ) strcpy( name1[clus1+i], name2[i] );
296
297 for( i=0; i<clus1; i++ ) for( j=0; j<clus1; j++ ) eff[i][j] = effarr1[i]* effarr1[j];
298 for( i=0; i<clus1; i++ ) for( j=clus1; j<clus1+clus2; j++ ) eff[i][j] = effarr1[i]* effarr2[j-clus1];
299 for( i=clus1; i<clus1+clus2; i++ ) for( j=0; j<clus1; j++ ) eff[i][j] = effarr2[i-clus1] * effarr1[j];
300 for( i=clus1; i<clus1+clus2; i++ ) for( j=clus1; j<clus1+clus2; j++ ) eff[i][j] = effarr2[i-clus1] * effarr2[j-clus1];
301 }
302
303
304
305 #if 0
306 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 )
307 #else
308 int conjuctionforgaln( int s0, int s1, char **seq, char **aseq, double *peff, double *eff, char **name, char **aname, char *d )
309 #endif
310 {
311 int m, k;
312 char b[B];
313 double total;
314
315 #if 0
316 fprintf( stderr, "s0 = %d, s1 = %d\n", s0, s1 );
317 #endif
318
319 total = 0.0;
320 d[0] = 0;
321 for( m=s0, k=0; m<s1; m++ )
322 {
323 {
324 sprintf( b, " %d", m+1 );
325 #if 1
326 if( strlen( d ) < 100 ) strcat( d, b );
327 #else
328 strcat( d, b );
329 #endif
330 aseq[k] = seq[m];
331 peff[k] = eff[m];
332 total += peff[k];
333 #if 0
334 strcpy( aname[k], name[m] );
335 #endif
336 k++;
337 }
338 }
339 #if 1
340 for( m=0; m<k; m++ )
341 {
342 peff[m] /= total;
343 // fprintf( stderr, "peff[%d] = %f\n", m, peff[m] );
344 }
345 #endif
346 return( k );
347 }
348
349 void makegrouprna( RNApair ***group, RNApair ***all, int *memlist )
350 {
351 int k, m;
352 for( k=0; (m=*memlist)!=-1; memlist++, k++ )
353 {
354 group[k] = all[m];
355 }
356 }
357
358
359 int fastconjuction_noweight( int *memlist, char **seq, char **aseq, double *peff, char *d )
360 {
361 int m, k, dln;
362 char b[B];
363 double total;
364
365 #if DEBUG
366 fprintf( stderr, "s = %d\n", s );
367 #endif
368
369 total = 0.0;
370 d[0] = 0;
371 dln = 0;
372 for( k=0; *memlist!=-1; memlist++, k++ )
373 {
374 m = *memlist;
375 dln += sprintf( b, " %d", m+1 );
376 #if 1
377 if( dln < 100 ) strcat( d, b );
378 #else
379 strcat( d, b );
380 #endif
381 aseq[k] = seq[m];
382 peff[k] = 1.0;
383 total += peff[k];
384 }
385 #if 1
386 for( m=0; m<k; m++ )
387 peff[m] /= total;
388 #endif
389 return( k );
390 }
391
392 int fastconjuction_noname_kozo( int *memlist, char **seq, char **aseq, double *peff, double *eff, double *peff_kozo, double *eff_kozo, char *d )
393 {
394 int m, k, dln;
395 char b[B];
396 double total;
397 double total_kozo;
398
399 #if DEBUG
400 fprintf( stderr, "s = %d\n", s );
401 #endif
402
403 total = 0.0;
404 total_kozo = 0.0;
405 d[0] = 0;
406 dln = 0;
407 for( k=0; *memlist!=-1; memlist++, k++ )
408 {
409 m = *memlist;
410 dln += sprintf( b, " %d", m+1 );
411 #if 1
412 if( dln < 100 ) strcat( d, b );
413 #else
414 strcat( d, b );
415 #endif
416 aseq[k] = seq[m];
417 peff[k] = eff[m];
418 peff_kozo[k] = eff_kozo[m];
419 total += peff[k];
420 total_kozo += peff_kozo[k];
421 }
422 #if 1
423 for( m=0; m<k; m++ )
424 {
425 // fprintf( stderr, "peff[%d] = %f\n", m, peff[m] );
426 peff[m] /= total;
427 }
428 if( total_kozo )
429 {
430 for( m=0; m<k; m++ )
431 {
432 // fprintf( stderr, "peff[%d] = %f\n", m, peff[m] );
433 peff_kozo[m] /= total_kozo;
434 if( peff_kozo[m] > 0.0 ) peff_kozo[m] += peff[m];
435 }
436 }
437 else //iranai
438 {
439 for( m=0; m<k; m++ )
440 {
441 peff_kozo[m] = 0.0;
442 }
443 }
444 #endif
445
446 // fprintf( stderr, "\n\ntbfast_total_kozo = %f\n\n", total_kozo );
447 return( k );
448 }
449
450
451 int fastconjuction_noname( int *memlist, char **seq, char **aseq, double *peff, double *eff, char *d, double mineff )
452 {
453 int m, k, dln;
454 char b[B];
455 double total;
456
457 #if DEBUG
458 fprintf( stderr, "s = %d\n", s );
459 #endif
460
461 total = 0.0;
462 d[0] = 0;
463 dln = 0;
464 for( k=0; *memlist!=-1; memlist++, k++ )
465 {
466 m = *memlist;
467 dln += sprintf( b, " %d", m+1 );
468 #if 1
469 if( dln < 100 ) strcat( d, b );
470 #else
471 strcat( d, b );
472 #endif
473 aseq[k] = seq[m];
474 if( eff[m] < mineff )
475 peff[k] = mineff;
476 else
477 peff[k] = eff[m];
478
479 total += peff[k];
480 }
481 #if 1
482 for( m=0; m<k; m++ )
483 {
484 // fprintf( stderr, "peff[%d] = %f\n", m, peff[m] );
485 peff[m] /= total;
486 }
487 #endif
488 return( k );
489 }
490
491 int fastconjuction( int *memlist, char **seq, char **aseq, double *peff, double *eff, char name[M][B], char aname[M][B], char *d )
492 {
493 int m, k, dln;
494 char b[B];
495 double total;
496
497 #if DEBUG
498 fprintf( stderr, "s = %d\n", s );
499 #endif
500
501 total = 0.0;
502 d[0] = 0;
503 dln = 0;
504 for( k=0; *memlist!=-1; memlist++, k++ )
505 {
506 m = *memlist;
507 dln += sprintf( b, " %d", m+1 );
508 #if 1
509 if( dln < 100 ) strcat( d, b );
510 #else
511 strcat( d, b );
512 #endif
513 aseq[k] = seq[m];
514 peff[k] = eff[m];
515 total += peff[k];
516 #if 0
517 strcpy( aname[k], name[m] );
518 #endif
519 }
520 #if 1
521 for( m=0; m<k; m++ )
522 peff[m] /= total;
523 #endif
524 return( k );
525 }
526
527
528
529 int conjuctionfortbfast_old( char **pair, int s, char **seq, char **aseq, double *peff, double *eff, char *d )
530 {
531 int m, k;
532 char *b;
533 double total;
534
535 b = calloc( B, sizeof( char ) );
536 #if DEBUG
537 fprintf( stderr, "s = %d\n", s );
538 #endif
539
540 total = 0.0;
541 d[0] = 0;
542 for( m=s, k=0; m<njob; m++ )
543 {
544 if( pair[s][m] != 0 )
545 {
546 sprintf( b, " %d", m+1 );
547 #if 1
548 if( strlen( d ) < 100 ) strcat( d, b );
549 #else
550 strcat( d, b );
551 #endif
552 aseq[k] = seq[m];
553 peff[k] = eff[m];
554 total += peff[k];
555 #if 0
556 strcpy( aname[k], name[m] );
557 #endif
558 k++;
559 }
560 }
561 #if 1
562 for( m=0; m<k; m++ )
563 peff[m] /= total;
564 #endif
565 free( b );
566 return( k );
567 }
568
569 int conjuction( char **pair, int s, char **seq, char **aseq, double *peff, double *eff, char **name, char **aname, char *d )
570 {
571 int m, k;
572 char b[B];
573 double total;
574
575 #if DEBUG
576 fprintf( stderr, "s = %d\n", s );
577 #endif
578
579 total = 0.0;
580 d[0] = 0;
581 for( m=s, k=0; m<njob; m++ )
582 {
583 if( pair[s][m] != 0 )
584 {
585 sprintf( b, " %d", m+1 );
586 #if 1
587 if( strlen( d ) < 100 ) strcat( d, b );
588 #else
589 strcat( d, b );
590 #endif
591 aseq[k] = seq[m];
592 peff[k] = eff[m];
593 total += peff[k];
594 #if 0
595 strcpy( aname[k], name[m] );
596 #endif
597 k++;
598 }
599 }
600 #if 0
601 for( m=0; m<k; m++ )
602 peff[m] /= total;
603 #endif
604 return( k );
605 }
606
607 void floatdelete( float **cpmx, int d, int len )
608 {
609 int i, j;
610
611 for( i=d; i<len-1; i++ )
612 {
613 for( j=0; j<nalphabets; j++ )
614 {
615 cpmx[j][i] = cpmx[j][i+1];
616 }
617 }
618 }
619
620 void chardelete( char *seq, int d )
621 {
622 char b[N];
623
624 strcpy( b, seq+d+1 );
625 strcpy( seq+d, b );
626 }
627
628 int RootBranchNode( int nseq, int ***topol, int step, int branch )
629 {
630 int i, j, s1, s2, value;
631
632 value = 1;
633 for( i=step+1; i<nseq-2; i++ )
634 {
635 for( j=0; (s1=topol[i][0][j])>-1; j++ )
636 if( s1 == topol[step][branch][0] ) value++;
637 for( j=0; (s2=topol[i][1][j])>-1; j++ )
638 if( s2 == topol[step][branch][0] ) value++;
639 }
640 return( value );
641 }
642
643 void BranchLeafNode( int nseq, int ***topol, int *node, int step, int branch )
644 {
645 int i, j, k, s;
646
647 for( i=0; i<nseq; i++ ) node[i] = 0;
648 for( i=0; i<step-1; i++ )
649 for( k=0; k<2; k++ )
650 for( j=0; (s=topol[i][k][j])>-1; j++ )
651 node[s]++;
652 for( k=0; k<branch+1; k++ )
653 for( j=0; (s=topol[step][k][j])>-1; j++ )
654 node[s]++;
655 }
656
657 void RootLeafNode( int nseq, int ***topol, int *node )
658 {
659 int i, j, k, s;
660 for( i=0; i<nseq; i++ ) node[i] = 0;
661 for( i=0; i<nseq-2; i++ )
662 for( k=0; k<2; k++ )
663 for( j=0; (s=topol[i][k][j])>-1; j++ )
664 node[s]++;
665 }
666
667 void nodeFromABranch( int nseq, int *result, int **pairwisenode, int ***topol, double **len, int step, int num )
668 {
669 int i, s, count;
670 int *innergroup;
671 int *outergroup1;
672 #if 0
673 int outergroup2[nseq];
674 int table[nseq];
675 #else
676 static int *outergroup2 = NULL;
677 static int *table = NULL;
678 if( outergroup2 == NULL )
679 {
680 outergroup2 = AllocateIntVec( nseq );
681 table = AllocateIntVec( nseq );
682 }
683 #endif
684 innergroup = topol[step][num];
685 outergroup1 = topol[step][!num];
686 for( i=0; i<nseq; i++ ) table[i] = 1;
687 for( i=0; (s=innergroup[i])>-1; i++ ) table[s] = 0;
688 for( i=0; (s=outergroup1[i])>-1; i++ ) table[s] = 0;
689 for( i=0, count=0; i<nseq; i++ )
690 {
691 if( table[i] )
692 {
693 outergroup2[count] = i;
694 count++;
695 }
696 }
697 outergroup2[count] = -1;
698
699 for( i=0; (s=innergroup[i])>-1; i++ )
700 {
701 result[s] = pairwisenode[s][outergroup1[0]]
702 + pairwisenode[s][outergroup2[0]]
703 - pairwisenode[outergroup1[0]][outergroup2[0]] - 1;
704 result[s] /= 2;
705 }
706 for( i=0; (s=outergroup1[i])>-1; i++ )
707 {
708 result[s] = pairwisenode[s][outergroup2[0]]
709 + pairwisenode[s][innergroup[0]]
710 - pairwisenode[innergroup[0]][outergroup2[0]] + 1;
711 result[s] /= 2;
712 }
713 for( i=0; (s=outergroup2[i])>-1; i++ )
714 {
715 result[s] = pairwisenode[s][outergroup1[0]]
716 + pairwisenode[s][innergroup[0]]
717 - pairwisenode[innergroup[0]][outergroup1[0]] + 1;
718 result[s] /= 2;
719 }
720
721 #if 0
722 for( i=0; i<nseq; i++ )
723 fprintf( stderr, "result[%d] = %d\n", i+1, result[i] );
724 #endif
725 }
726
727
728
729
730
731
732
733
734
735
736
737
738
739 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 )
740 {
741 int i, k, j;
742 int r1;
743 // char *pair;
744
745 // pair = calloc( locnjob, sizeof( char ) );
746
747 for( i=0; i<locnjob; i++ ) pair[i] = 0;
748 for( i=0, k=0; (r1=topol[step][branch][i])>-1; i++ )
749 {
750 pair[r1] = 1;
751 memlist1[k++] = r1;
752 }
753 memlist1[k] = -1;
754
755 for( i=0, k=0; i<locnjob; i++ )
756 {
757 if( !pair[i] )
758 {
759 memlist2[k++] = i;
760 }
761 }
762 memlist2[k] = -1;
763
764 *s1 = memlist1[0];
765 *s2 = memlist2[0];
766
767 if( smalldistmtx )
768 {
769 int im, jm;
770 for( i=0; (im=memlist1[i])!=-1; i++ ) for( j=0; (jm=memlist2[j])!=-1; j++ )
771 {
772 smalldistmtx[i][j] = distmtx[MIN(im,jm)][MAX(im,jm)];
773 // fprintf( stderr, "#### %d-%d, %f\n", im, jm, smalldistmtx[i][j] );
774 }
775 }
776 // free( pair );
777 }
778
779
780 void makeEffMtx( int nseq, double **mtx, double *vec )
781 {
782 int i, j;
783 for( i=0; i<nseq; i++ ) for( j=0; j<nseq; j++ )
784 mtx[i][j] = vec[i] * vec[j];
785 }
786
787 void node_eff( int nseq, double *eff, int *node )
788 {
789 int i;
790 extern double ipower( double, int );
791 for( i=0; i<nseq; i++ )
792 eff[i] = ipower( 0.5, node[i] ) + geta2;
793 /*
794 eff[i] = ipower( 0.5, node[i] ) + 0;
795 */
796 #if DEBUG
797 for( i=0; i<nseq; i++ )
798 #endif
799 }
800
801
802 int shrinklocalhom( char **pair, int s1, int s2, LocalHom **localhom, LocalHom ***localhomshrink )
803 {
804 int m1, k1, m2, k2;
805
806 for( m1=s1, k1=0; m1<njob; m1++ )
807 {
808 if( pair[s1][m1] != 0 )
809 {
810 for( m2=s2, k2=0; m2<njob; m2++ )
811 {
812 if( pair[s2][m2] != 0 )
813 {
814 if( localhom[m1][m2].opt == -1 )
815 localhomshrink[k1][k2] = NULL;
816 else
817 localhomshrink[k1][k2] = localhom[m1]+m2;
818 k2++;
819 }
820 }
821 k1++;
822 }
823 }
824 return( 0 );
825 }
826
827 int msshrinklocalhom_fast( int *memlist1, int *memlist2, LocalHom **localhom, LocalHom ***localhomshrink )
828 {
829 int m1, k1, m2, k2;
830
831 for( k1=0; (m1=memlist1[k1])!=-1; k1++ )
832 {
833 for( k2=0; (m2=memlist2[k2])!=-1; k2++ )
834 {
835 if( localhom[m1][m2].opt == -1 )
836 localhomshrink[k1][k2] = NULL;
837 else
838 localhomshrink[k1][k2] = localhom[m1]+m2;
839 }
840 }
841 return( 0 );
842 }
843 int fastshrinklocalhom_one( int *mem1, int *mem2, int norg, LocalHom **localhom, LocalHom ***localhomshrink )
844 {
845 int k1, k2;
846 int *intpt1, *intpt2;
847
848
849 for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ )
850 {
851 for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ )
852 {
853 if( *intpt2 != norg )
854 {
855 fprintf( stderr, "ERROR! *intpt2 = %d\n", *intpt2 );
856 exit( 1 );
857 }
858 if( localhom[*intpt1][0].opt == -1 )
859 localhomshrink[k1][k2] = NULL;
860 else
861 localhomshrink[k1][k2] = localhom[*intpt1];
862 }
863 }
864 return( 0 );
865 }
866
867 int fastshrinklocalhom( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink )
868 {
869 int k1, k2;
870 int *intpt1, *intpt2;
871
872
873 for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ )
874 {
875 for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ )
876 {
877 if( localhom[*intpt1][*intpt2].opt == -1 )
878 localhomshrink[k1][k2] = NULL;
879 else
880 localhomshrink[k1][k2] = localhom[*intpt1]+*intpt2;
881 }
882 }
883 return( 0 );
884 }
885
886 int msfastshrinklocalhom( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink )
887 {
888 int k1, k2;
889 int *intpt1, *intpt2;
890 int m1, m2;
891
892 for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ )
893 {
894 for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ )
895 {
896 m1 = MIN(*intpt1,*intpt2); m2 = MAX(*intpt1,*intpt2);
897 if( localhom[m1][m2].opt == -1 )
898 localhomshrink[k1][k2] = NULL;
899 else
900 localhomshrink[k1][k2] = localhom[m1]+m2;
901 }
902 }
903 return( 0 );
904 }
905