Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / mafft / core / tditeration.c
diff --git a/website/archive/binaries/mac/src/mafft/core/tditeration.c b/website/archive/binaries/mac/src/mafft/core/tditeration.c
new file mode 100644 (file)
index 0000000..e461f09
--- /dev/null
@@ -0,0 +1,2399 @@
+
+/* 
+       tree-dependent iteration   
+    algorithm A+ when group-to-group, C when group-to-singleSeqence 
+                        OR
+    algorithm A+
+*/
+
+#include "mltaln.h"
+
+
+#define DEBUG 0
+#define RECORD 0
+
+extern char **seq_g;
+extern char **res_g;
+
+static int nwa;
+
+#ifdef enablemultithread
+typedef struct _threadarg
+{
+       int thread_no;
+       int *jobposintpt;
+       int *ndonept;
+       int *ntrypt;
+       int *collectingpt;
+       int njob;
+       int nbranch;
+       int maxiter;
+       int nkozo;
+       int *subgenerationpt;
+       float *basegainpt;
+       float *gainlist;
+       float *tscorelist;
+       int *generationofinput;
+       char *kozoarivec;       
+       char **mastercopy;
+       char ***candidates;
+       int *generationofmastercopypt;
+       int *branchtable;
+       RNApair ***singlerna;
+       LocalHom **localhomtable;
+       int alloclen;
+       Node *stopol;
+       int ***topol;
+//     double **len;
+       float **tscorehistory_detail;
+       int *finishpt;
+       pthread_mutex_t *mutex;
+       pthread_cond_t *collection_end;
+       pthread_cond_t *collection_start;
+} threadarg_t;
+#endif
+
+#if 1
+static void shuffle( int *arr, int n )
+{
+       int i;
+       int x;
+       int b;
+
+       for( i=1; i<n; i++ )
+       {
+               x = rand() % (i+1);
+               if( x != i )
+               {
+                       b = arr[i];
+                       arr[i] = arr[x];
+                       arr[x] = b;
+               }
+       }
+}
+#endif
+
+static void Writeoption2( FILE *fp, int cycle, double cut )
+{
+       fprintf( fp, "%dth cycle\n", cycle );
+    fprintf( fp, "marginal score to search : current score * (100-%d) / 100\n", (int)cut );
+}
+
+static void Writeoptions( FILE *fp )
+{
+       fprintf( fp, "Tree-dependent-iteration\n" );
+    if( scoremtx == 1 )
+        fprintf( fp, "Blosum %d\n", nblosum );
+    else if( scoremtx == -1 )
+        fprintf( fp, "DNA\n" );
+    else if( scoremtx == 2 )
+        fprintf( fp, "Miyata-Yasunaga\n" );
+       else
+               fprintf( fp, "JTT %dPAM\n", pamN );
+
+       if( scoremtx == 0 || scoremtx == 1 )
+       fprintf( fp, "Gap Penalty = %+5.3f, %5.2f, %+5.3f\n", (double)ppenalty/1000, (double)ppenalty_ex/1000, (double)poffset/1000 );
+       else
+               fprintf( fp, "Gap Penalty = %+5.3f\n", (double)penalty/1000 );
+               
+
+    if( scmtd == 3 )
+        fprintf( fp, "score of rnd or sco\n" );
+    else if( scmtd == 4 )
+        fprintf( fp, "score = sigma( score for a pair of homologous amino acids ) / ( number of amino acids pairs )\n" );
+    else if( scmtd == 5 )
+        fprintf( fp, "score : SP\n" );
+    if( mix )
+        fprintf( fp, "?\n" );
+    else
+    { 
+        if( weight == 2 )
+            fprintf( fp, "weighted rationale-1,  geta2 = %f\n", geta2 );
+        else if( weight == 3 )
+            fprintf( fp, "weighted like ClustalW," );
+        else if( weight == 4 )
+            fprintf( fp, "weighted rationale-2,  geta2 = %f\n", geta2 );
+        else
+            fprintf( fp, "unweighted\n" );
+    }
+    if( weight && utree )
+        fprintf( fp, "using tree defined by the file hat2.\n" );
+    if( weight && !utree )
+        fprintf( fp, "using temporary tree.\n" );
+
+       if( treemethod == 'n' )
+               fprintf( fp, "Tree is calculated with Neighbor-Joining Method.\n" );
+       else if( treemethod == 'q' )
+               fprintf( fp, "Tree is calculated with Minimum linkage.\n" );
+       else if( treemethod == 'X' )
+               fprintf( fp, "Tree is calculated with simplified UPG Method and UPG Method.\n" );
+       else if( treemethod == 'E' )
+               fprintf( fp, "Tree is calculated with UPG Method.\n" );
+       else
+               fprintf( fp, "Tree is calculated with unknown Method.\n" );
+               
+       if( alg == 'C' ) 
+               fprintf( fp, "Algorithm A+ / C\n" );
+       else if( alg == 'A' ) 
+               fprintf( fp, "Algorithm A+ \n" );
+       else if( alg == 'a' ) 
+               fprintf( fp, "Algorithm A \n" );
+       else 
+               fprintf( fp, "Algorithm ? \n" );
+
+       if( use_fft )
+       {
+               if( scoremtx == -1 )
+               {
+                       fprintf( fp, "Basis : 4 nucleotides\n" );
+               }
+               else
+               {
+                       if( fftscore )
+                               fprintf( fp, "Basis : Polarity and Volume\n" );
+                       else
+                               fprintf( fp, "Basis : 20 amino acids\n" );
+               }
+               fprintf( fp, "Threshold   of anchors = %d%%\n", fftThreshold );
+               fprintf( fp, "window size of anchors = %dsites\n", fftWinSize );
+       }
+}
+
+#ifdef enablemultithread
+
+static void freelocalarrays( 
+       float *tscorehistory,
+       RNApair ***grouprna1, RNApair ***grouprna2,
+       RNApair *rnapairboth,
+       char *indication1, char *indication2,
+       double *effarr, double *effarrforlocalhom, double *effarr1, double *effarr2,
+       char **mseq1, char **mseq2,
+       char **localcopy,
+       int *gapmap1, int *gapmap2,
+       double *effarr1_kozo, double *effarr2_kozo, double *effarr_kozo,
+       char **pair,
+       LocalHom *** localhomshrink
+)
+{
+//     fprintf( stderr, "Skipping freelocalarrays\n" );
+//     return;
+       int i;
+       if( commonIP ) FreeIntMtx( commonIP );
+       commonIP = NULL;
+       Falign( NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, 0, NULL );
+       Falign_localhom( NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, NULL, NULL,NULL, 0, NULL );
+       if( rnakozo && rnaprediction == 'm' )
+       {
+               free( grouprna1 ); // nakamimo?
+               free( grouprna2 ); // nakamimo?
+       }
+
+       free( tscorehistory );
+       free( indication1 );
+       free( indication2 );
+       free( effarr );
+       free( effarrforlocalhom );
+       free( effarr1 );
+       free( effarr2 );
+       free( mseq1 );
+       free( mseq2 );
+       FreeCharMtx( localcopy );
+       free( gapmap1 );
+       free( gapmap2 );
+
+       free( effarr1_kozo );
+       free( effarr2_kozo );
+       free( effarr_kozo );
+
+       FreeCharMtx( pair );
+
+       if( rnakozo ) free( rnapairboth );
+
+       if( constraint )
+       {
+               for( i=0; i<njob; i++)
+               {
+                       free( localhomshrink[i] ); // nakamimo??
+               }
+               free( localhomshrink );
+       }
+}
+
+
+static void *athread( void *arg )
+{
+
+       threadarg_t *targ = (threadarg_t *)arg;
+       int thread_no = targ->thread_no;
+       int njob = targ->njob;
+       int nbranch = targ->nbranch;
+       int maxiter = targ->maxiter;
+       int *ndonept = targ->ndonept;
+       int *ntrypt = targ->ntrypt;
+       int *collectingpt = targ->collectingpt;
+       int *jobposintpt = targ->jobposintpt;
+       int nkozo = targ->nkozo;
+       float *gainlist = targ->gainlist;
+       float *tscorelist = targ->tscorelist;
+       int *generationofinput = targ->generationofinput;
+       int *subgenerationpt = targ->subgenerationpt;
+       float *basegainpt = targ->basegainpt;
+       char *kozoarivec = targ->kozoarivec;    
+       char **mastercopy = targ->mastercopy;
+       char ***candidates = targ->candidates;
+       int *generationofmastercopypt = targ->generationofmastercopypt;
+       int *branchtable = targ->branchtable;
+       RNApair ***singlerna = targ->singlerna;
+       LocalHom **localhomtable = targ->localhomtable;
+       int alloclen = targ->alloclen;
+       Node * stopol = targ->stopol;
+       int ***topol = targ->topol;
+//     double **len = targ->len;
+       float **tscorehistory_detail = targ->tscorehistory_detail;
+       int *finishpt = targ->finishpt;
+
+       int i, j, k, l, ii;
+       float gain;
+       int iterate;
+       char **pair;
+       int locnjob;
+       int s1, s2;
+       int clus1, clus2;
+       char **localcopy;
+       char **mseq1, **mseq2;
+       double *effarr, *effarr_kozo; // re-calc 
+       double *effarr1, *effarr2, *effarr1_kozo, *effarr2_kozo;
+       char *indication1, *indication2;
+       int length;
+       RNApair ***grouprna1, ***grouprna2;
+       RNApair *rnapairboth;
+       LocalHom ***localhomshrink;
+       int *gapmap1, *gapmap2;
+       float tscore, mscore, oimpmatch, impmatch;
+       int identity;
+       double tmpdouble;
+       float naivescore0 = 0, naivescore1;
+       double *effarrforlocalhom;
+       float *tscorehistory;
+       int intdum;
+#if 0
+       int oscillating;
+       int lin, ldf;
+#endif
+       float maxgain;
+       int bestthread;
+       int branchpos;
+       int subgenerationatfirst;
+       double unweightedspscore;
+       int myjob;
+       int converged2 = 0;
+       int chudanres;
+
+
+       locnjob = njob;
+
+       if( utree == 0 )
+       {
+               fprintf( stderr, "Dynamic tree is not supported in the multithread version.\n" );
+               exit( 1 );
+       }
+       if( score_check == 2 )
+       {
+               fprintf( stderr, "Score_check 2 is not supported in the multithread version.\n" );
+               exit( 1 );
+       }
+
+       if( weight == 2 )
+       {
+               fprintf( stderr, "Weight 2 is not supported in the multithread version.\n" );
+               exit( 1 );
+       }
+       if( cooling &&  cut > 0.0 )
+       {
+               fprintf( stderr, "Cooling is not supported in the multithread version.\n" );
+               exit( 1 );
+       }
+
+       tscorehistory = calloc( maxiter, sizeof( float ) );
+
+       if( rnakozo && rnaprediction == 'm' )
+       {
+               grouprna1 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) );
+               grouprna2 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) );
+       }
+       else
+       {
+               grouprna1 = grouprna2 = NULL;
+       }
+
+       indication1 = AllocateCharVec( njob*3+50 );
+       indication2 = AllocateCharVec( njob*3+50 );
+       effarr = AllocateDoubleVec( locnjob );
+       effarrforlocalhom = AllocateDoubleVec( locnjob );
+       effarr1 = AllocateDoubleVec( locnjob );
+       effarr2 = AllocateDoubleVec( locnjob );
+       mseq1 = AllocateCharMtx( locnjob, 0 );
+       mseq2 = AllocateCharMtx( locnjob, 0 );
+       localcopy = AllocateCharMtx( locnjob, alloclen );
+       gapmap1 = AllocateIntVec( alloclen );
+       gapmap2 = AllocateIntVec( alloclen );
+
+       effarr1_kozo = AllocateDoubleVec( locnjob ); // tsuneni allocate suru.
+       effarr2_kozo = AllocateDoubleVec( locnjob ); // tsuneni allocate suru.
+       effarr_kozo = AllocateDoubleVec( locnjob ); 
+       for( i=0; i<locnjob; i++ )
+               effarr_kozo[i] = effarr1_kozo[i] = effarr2_kozo[i] = 0.0;
+
+       pair = AllocateCharMtx( locnjob, locnjob );
+
+
+       if( rnakozo ) rnapairboth = (RNApair *)calloc( alloclen, sizeof( RNApair ) );
+
+       if( constraint )
+       {
+               localhomshrink = (LocalHom ***)calloc( njob, sizeof( LocalHom ** ) );
+               for( i=0; i<njob; i++)
+               {
+                       localhomshrink[i] = (LocalHom **)calloc( njob, sizeof( LocalHom * ) );
+               }
+       }
+
+
+       if( thread_no == 0 )
+       {
+               *ntrypt = 0;
+               srand( randomseed );
+               *finishpt = 0;
+               for( iterate=0; iterate<maxiter; iterate++ ) 
+               {
+                       pthread_mutex_lock( targ->mutex );
+
+                       if( *collectingpt == 1 )
+                       {
+                               *collectingpt = 0;
+                               *generationofmastercopypt = iterate;
+                               *subgenerationpt = 0;
+                               *basegainpt = 0.0;
+                               *ndonept = 0;
+                               *jobposintpt = 0;
+                               for( i=0; i<nwa; i++ ) gainlist[i] = 0;
+                               for( i=0; i<nwa; i++ ) tscorelist[i] = 0.0;
+                               for( i=0; i<nbranch; i++ ) generationofinput[i] = -1;
+                               if( parallelizationstrategy != BESTFIRST && randomseed != 0 ) shuffle( branchtable, nbranch );
+                               pthread_cond_broadcast( targ->collection_end );
+                               pthread_mutex_unlock( targ->mutex );
+                       }
+                       else
+                       {
+                               pthread_cond_broadcast( targ->collection_end );
+                               pthread_mutex_unlock( targ->mutex );
+                               freelocalarrays
+                               ( 
+                                       tscorehistory,
+                                       grouprna1, grouprna2,
+                                       rnapairboth,
+                                       indication1, indication2,
+                                       effarr, effarrforlocalhom, effarr1, effarr2,
+                                       mseq1, mseq2,
+                                       localcopy,
+                                       gapmap1, gapmap2,
+                                       effarr1_kozo, effarr2_kozo, effarr_kozo,
+                                       pair,
+                                       localhomshrink
+                               );
+//                             return( NULL );
+                               pthread_exit( NULL );
+                       }
+
+                       pthread_mutex_lock( targ->mutex );
+                       while( *ndonept < nbranch )
+                               pthread_cond_wait( targ->collection_start, targ->mutex );
+                       pthread_mutex_unlock( targ->mutex );
+//                     fprintf( stderr, "Thread 0 got a signal, *collectionpt = %d\n", *collectingpt );
+
+/* 
+                       Hoka no thread ga keisan
+*/
+
+                       pthread_mutex_lock( targ->mutex );
+                       *collectingpt = 1; // chofuku
+
+#if 0
+                       for( i=0; i<nbranch; i++ )
+                       {
+                               if( generationofinput[i] != iterate )
+                               {
+                                       fprintf( stderr, "Error! generationofinput[%d] = %d, but iterate=%d\n", i, generationofinput[i], iterate );
+                                       exit( 1 );
+
+                               }
+                       }
+#endif
+       
+                       maxgain = gainlist[1];
+                       bestthread = 1;
+                       for( i=2; i<nwa; i++ )
+                       {
+                               if( gainlist[i] > maxgain )
+                               {
+                                       maxgain = gainlist[i];
+                                       bestthread = i;
+                               }
+                       }
+       
+                       if( maxgain > 0.0 )
+                       {
+//                             fprintf( stderr, "\nGain = %f\n", maxgain );
+//                             fprintf( stderr, "best gain = %f by thread %d\n", gainlist[bestthread], bestthread );
+//                             fprintf( stderr, "tscorelist[best] = %f by thread %d\n", tscorelist[bestthread], bestthread );
+                               if( parallelizationstrategy == BESTFIRST )
+                               {
+                                       for( i=0; i<locnjob; i++ ) strcpy( mastercopy[i], candidates[bestthread][i] );
+                                       if( scoreout )
+                                       {
+                                               unweightedspscore = plainscore( locnjob, mastercopy );
+                                               fprintf( stderr, "\nSCORE %d = %.0f, ", iterate * nbranch, unweightedspscore );
+                                               fprintf( stderr, "SCORE / residue = %f", unweightedspscore / ( locnjob * strlen( mastercopy[0] ) ) );
+                                               if( weight || constraint ) fprintf( stderr, " (differs from the objective score)" );
+                                               fprintf( stderr, "\n" );
+                                       }
+                               }
+#if 1
+//                             fprintf( stderr, "gain(%d, by %d) = %f\n", iterate, bestthread, maxgain );
+                               for( i=iterate-1; i>0; i-- )
+                               {
+//                                     if( iterate-i < 15 ) fprintf( stderr, "hist[%d] = %f\n", i, tscorehistory[i] );
+                                       if( tscorehistory[i] == tscorelist[bestthread] )
+                                       {
+                                               fprintf( stderr, "\nOscillating? %f == %f\n", tscorehistory[i], tscorelist[bestthread] );
+                                               *collectingpt = -1;
+                                               break;
+                                       }
+                               }
+                               tscorehistory[iterate] = tscorelist[bestthread];
+#endif
+                       }
+                       else
+                       {
+                               fprintf( stderr, "\nConverged.\n" );
+                               *collectingpt = -1;
+//                             pthread_cond_broadcast( targ->collection_end );
+//                             pthread_mutex_unlock( targ->mutex );
+//                             freelocalarrays();
+//                             return( NULL );
+//                             pthread_exit( NULL );
+                       }
+
+#if 1
+                       if( *finishpt )
+                       {
+                               fprintf( stderr, "\nConverged2.\n" );
+                               *collectingpt = -1;
+                       }
+#endif
+
+                       pthread_mutex_unlock( targ->mutex );
+               }
+               pthread_mutex_lock( targ->mutex );
+               fprintf( stderr, "\nReached %d\n", maxiter );
+               *collectingpt = -1;
+               pthread_cond_broadcast( targ->collection_end );
+               pthread_mutex_unlock( targ->mutex );
+               freelocalarrays
+               ( 
+                       tscorehistory,
+                       grouprna1, grouprna2,
+                       rnapairboth,
+                       indication1, indication2,
+                       effarr, effarrforlocalhom, effarr1, effarr2,
+                       mseq1, mseq2,
+                       localcopy,
+                       gapmap1, gapmap2,
+                       effarr1_kozo, effarr2_kozo, effarr_kozo,
+                       pair,
+                       localhomshrink
+               );
+               return( NULL );
+               pthread_exit( NULL );
+       }
+       else
+       {
+               while( 1 )
+               {
+#if 0
+                       if( iterate % 2 == 0 ) 
+                       {
+                               lin = 0; ldf = +1;
+                       }
+                       else
+                       {
+                               lin = locnjob - 2; ldf = -1;
+                       }       
+                       for( l=lin; l < locnjob-1 && l >= 0 ; l+=ldf )
+                               for( k=0; k<2; k++ ) 
+#endif
+
+                       pthread_mutex_lock( targ->mutex );
+                       while( *collectingpt > 0 )
+                               pthread_cond_wait( targ->collection_end, targ->mutex );
+                       if( *collectingpt == -1 )
+                       {
+                               pthread_mutex_unlock( targ->mutex );
+                               freelocalarrays
+                               ( 
+                                       tscorehistory,
+                                       grouprna1, grouprna2,
+                                       rnapairboth,
+                                       indication1, indication2,
+                                       effarr, effarrforlocalhom, effarr1, effarr2,
+                                       mseq1, mseq2,
+                                       localcopy,
+                                       gapmap1, gapmap2,
+                                       effarr1_kozo, effarr2_kozo, effarr_kozo,
+                                       pair,
+                                       localhomshrink
+                               );
+                               return( NULL );
+                               pthread_exit( NULL );
+                       }
+//                     pthread_mutex_unlock( targ->mutex );
+
+
+//                     pthread_mutex_lock( targ->mutex );
+                       if( *jobposintpt == nbranch )
+                       {
+                               if( *collectingpt != -1 ) *collectingpt = 1; // chofuku
+                               pthread_mutex_unlock( targ->mutex );
+                               continue;
+                       }
+//                     fprintf( stderr, "JOB jobposintpt=%d\n", *jobposintpt );
+                       myjob = branchtable[*jobposintpt];
+                       l = myjob / 2;
+                       if( l == locnjob-2 ) k = 1;
+                       else k = myjob - l * 2;
+//                     fprintf( stderr, "JOB l=%d, k=%d\n", l, k );
+                       branchpos = myjob;
+                       (*jobposintpt)++;
+                       iterate = *generationofmastercopypt;
+                       (*ntrypt)++;
+                       pthread_mutex_unlock( targ->mutex );
+
+
+
+//                     fprintf( stderr, "branchpos = %d (thread %d)\n", branchpos, thread_no );
+
+//                     fprintf( stderr, "iterate=%d, l=%d, k=%d (thread %d)\n", iterate, l, k, thread_no );
+
+#if 0
+                       fprintf( stderr, "STEP %03d-%03d-%d (Thread %d)    ", iterate+1, l+1, k, thread_no );
+                       fprintf( stderr, "STEP %03d-%03d-%d (thread %d) %s       ", iterate+1, l+1, k, thread_no, use_fft?"\n":"\n" );
+#endif
+                       for( i=0; i<locnjob; i++ ) for( j=0; j<locnjob; j++ ) pair[i][j] = 0;
+
+                       OneClusterAndTheOther( locnjob, pair, &s1, &s2, topol, l, k );
+#if 0
+                       fprintf( stderr, "STEP%d-%d\n", l, k );
+                       for( i=0; i<locnjob; i++ ) 
+                       {
+                               for( j=0; j<locnjob; j++ ) 
+                               {
+                                       fprintf( stderr, "%#3d", pair[i][j] );
+                               }
+                               fprintf( stderr, "\n" );
+                       }
+#endif
+                       if( !weight )
+                       {
+                               for( i=0; i<locnjob; i++ ) effarr[i] = 1.0;
+                               if( nkozo )
+                               {
+                                       for( i=0; i<locnjob; i++ ) 
+                                       {
+                                               if( kozoarivec[i] )
+                                                       effarr_kozo[i] = 1.0;
+                                               else
+                                                       effarr_kozo[i] = 0.0;
+                                       }
+                               }
+                       }
+                       else if( weight == 4 )
+                       {
+                               weightFromABranch( locnjob, effarr, stopol, topol, l, k );
+                               if( nkozo ) // hitomadu single weight.
+                               {
+                                       for( i=0; i<locnjob; i++ ) 
+                                       {
+                                               if( kozoarivec[i] ) effarr_kozo[i] = effarr[i]; 
+                                               else effarr_kozo[i] = 0.0;
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               fprintf( stderr, "weight error!\n" );
+                               exit( 1 );
+                       }
+
+                       yarinaoshi:
+
+                       pthread_mutex_lock( targ->mutex );
+                       for( i=0; i<locnjob; i++ ) strcpy( localcopy[i], mastercopy[i] );
+                       subgenerationatfirst = *subgenerationpt;
+                       pthread_mutex_unlock( targ->mutex );
+                       length = strlen( localcopy[0] );
+
+                       if( nkozo )
+                       {
+                               double tmptmptmp;
+                               tmptmptmp = 0.0;
+                               clus1 = conjuctionfortbfast_kozo( &tmptmptmp, pair, s1, localcopy, mseq1, effarr1, effarr, effarr1_kozo, effarr_kozo, indication1 );
+                               for( i=0; i<clus1; i++ ) effarr1_kozo[i] *= 1.0; // 0.5 ga sairyo ?
+                               tmptmptmp = 0.0;
+                               clus2 = conjuctionfortbfast_kozo( &tmptmptmp, pair, s2, localcopy, mseq2, effarr2, effarr, effarr2_kozo, effarr_kozo, indication2 );
+                               for( i=0; i<clus2; i++ ) effarr2_kozo[i] *= 1.0; // 0.5 ga sairyo ?
+
+#if 0
+                               fprintf( stderr, "\ngroup1 = %s\n", indication1 );
+                               for( i=0; i<clus1; i++ ) fprintf( stderr, "effarr1_kozo[%d], effarr1[]  = %f, %f\n", i, effarr1_kozo[i], effarr1[i] );
+                               fprintf( stderr, "\ngroup2 = %s\n", indication2 );
+                               for( i=0; i<clus2; i++ ) fprintf( stderr, "effarr2_kozo[%d], effarr2[]  = %f, %f\n", i, effarr2_kozo[i], effarr2[i] );
+#endif
+                       }
+                       else
+                       {
+                               clus1 = conjuctionfortbfast( pair, s1, localcopy, mseq1, effarr1, effarr, indication1 );
+                               clus2 = conjuctionfortbfast( pair, s2, localcopy, mseq2, effarr2, effarr, indication2 );
+                       }
+
+               if( rnakozo && rnaprediction == 'm' )
+               {       
+                               makegrouprnait( grouprna1, singlerna, pair, s1 );
+                               makegrouprnait( grouprna2, singlerna, pair, s2 );
+               }       
+
+                       if( score_check == 2 )
+                       {
+                               fprintf( stderr, "Score_check 2 is not supported in the multithread version.\n" );
+                               exit( 1 );
+                       }
+                       else if( score_check )
+                       {
+                               if( RNAscoremtx == 'r' )
+                                       intergroup_score_gapnomi( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); // gappick mae denaito dame
+                               else
+                                       intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); // gappick mae denaito dame
+
+                               if( constraint )
+                               {
+                                       shrinklocalhom( pair, s1, s2, localhomtable, localhomshrink );
+//                                     weightimportance4( clus1, clus2,  effarr1, effarr2, localhomshrink ); // >>>
+                                       oimpmatch = 0.0;
+                                       if( use_fft )
+                                       {
+                                               if( alg == 'Q' )
+                                               {
+                                                       part_imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 );
+                                                       if( rnakozo ) part_imp_rnaQ( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL );
+                                                       for(  i=length-1; i>=0; i-- )
+                                                       {
+                                                               oimpmatch += part_imp_match_out_scQ( i, i );
+//                                                             fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] );
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       part_imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+                                                       if( rnakozo ) part_imp_rna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL );
+                                                       for(  i=length-1; i>=0; i-- )
+                                                       {
+                                                               oimpmatch += part_imp_match_out_sc( i, i );
+//                                                             fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] );
+                                                       }
+                                               }
+//                                             fprintf( stderr, "otmpmatch = %f\n", oimpmatch );
+                                       }
+                                       else
+                                       {
+                                               if( alg == 'Q' )
+                                               {
+                                                       imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 );
+                                                       if( rnakozo ) imp_rnaQ( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL );
+
+                                                       for(  i=length-1; i>=0; i-- )
+                                                       {
+                                                               oimpmatch += imp_match_out_scQ( i, i );
+//                                                             fprintf( stderr, "#### i=%d, initial impmatch = %f\n", i, oimpmatch );
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+
+                                                       fprintf( stderr, "not supported\n" );
+                                                       exit( 1 );
+
+                                                       for(  i=length-1; i>=0; i-- )
+                                                       {
+                                                               oimpmatch += imp_match_out_sc( i, i );
+//                                                             fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] );
+                                                       }
+                                               }
+//                                             fprintf( stderr, "otmpmatch = %f\n", oimpmatch );
+                                       }
+//                                     fprintf( stderr, "#### initial impmatch = %f\n", oimpmatch );
+                               }
+                               else
+                               {
+                                       oimpmatch = 0.0;
+                               }
+
+
+//                             fprintf( stderr, "#### tmpdouble = %f\n", tmpdouble );
+                               mscore = (double)oimpmatch + tmpdouble;
+                       }
+                       else
+                       {
+                               fprintf( stderr, "score_check = %d\n", score_check );
+                               fprintf( stderr, "Not supported\n" );
+                               exit( 1 );
+                       }
+
+
+//                     if( rnakozo ) foldalignedrna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, rnapairboth );
+
+//                     if( !use_fft && !rnakozo )
+                       if( !use_fft )
+                       {
+                               commongappick_record( clus1, mseq1, gapmap1 );
+                               commongappick_record( clus2, mseq2, gapmap2 );
+                       }
+
+#if 0
+                       fprintf( stderr, "##### mscore = %f\n", mscore );
+#endif
+
+#if DEBUG
+                       if( !devide )
+                       {
+                       fprintf( trap_g, "\n%d-%d-%d\n", iterate+1, l+1, k );
+                       fprintf( trap_g, "group1 = %s\n", indication1 );
+                       fprintf( trap_g, "group2 = %s\n", indication2 );
+                               fflush( trap_g );
+                       }
+
+#endif
+#if 0
+                       printf( "STEP %d-%d-%d\n", iterate, l, k );
+                       for( i=0; i<clus2; i++ ) printf( "%f ", effarr2[i] );
+                       printf( "\n" );
+#endif
+                       if( constraint == 2 )
+                       {
+                               if( use_fft )
+                               {
+//                                     if( alg == 'Q' )
+//                                             part_imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 );
+//                                     else
+//                                             part_imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+                                       chudanres = 0;
+                                       Falign_localhom( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, localhomshrink, &impmatch, gapmap1, gapmap2, subgenerationpt, subgenerationatfirst, &chudanres );
+//                                     fprintf( stderr, "##### impmatch = %f\n", impmatch );
+                                       if( chudanres && parallelizationstrategy == BAATARI2 )
+                                       {
+//                                             fprintf( stderr, "#### yarinaoshi!!! INS-i\n" );
+                                               goto yarinaoshi;
+                                       }
+                               }
+                               else
+                               {
+                                       if( alg == 'Q' )
+                                       {
+                                               float wm;
+//                                             imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 ); // Ichijiteki, gapmap  wo tsukuttakara iranai.
+//                                             if( rnakozo ) imp_rnaQ( clus1, clus2, mseq1, mseq2, effarr1, effarr2, gapmap1, gapmap2, rnapairboth );
+
+                                               wm = Q__align_gapmap( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, localhomshrink, &impmatch, NULL, NULL, NULL, NULL, gapmap1, gapmap2 );
+                                               fprintf( stderr, "wm = %f\n", wm );
+#if 0
+                                               fprintf( stderr, "##### impmatch = %f->%f\n", oimpmatch, impmatch );
+                                               naivescore1 = naiveQpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty ) + impmatch;
+                                               fprintf( stderr, "##### naivscore1 = %f\n", naivescore1 );
+
+                                               if( naivescore1 > naivescore0 )
+                                                       fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                               else if( naivescore1 < naivescore0 )
+                                                       fprintf( stderr, "%d-%d, ns: DOWN! %f->%f\n", clus1, clus2, naivescore0, naivescore1 );
+                                               else
+                                                       fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+#if 0 // chuui
+                                               if( abs( wm - naivescore1 ) > 100 )
+                                               {
+//                                                     fprintf( stderr, "WARNING, wm=%f but naivescore=%f\n", wm, naivescore1 );
+//                                                     rewind( stdout );
+//                                                     for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+//                                                     for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+//                                                     exit( 1 );
+                                               }
+#endif
+#endif
+                                       }
+                                       else if( alg == 'R' )
+                                       {
+                                               float wm;
+                                               imp_match_init_strictR( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 ); // Ichijiteki, gapmap ha mada
+                                               wm = R__align( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, localhomshrink, &impmatch, NULL, NULL, NULL, NULL );
+//                                             fprintf( stderr, "##### impmatch = %f->%f\n", oimpmatch, impmatch );
+                                               naivescore1 = naiveRpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty ) + impmatch;
+//                                             fprintf( stderr, "##### naivscore1 = %f\n", naivescore1 );
+
+                                               if( naivescore1 > naivescore0 )
+                                                       fprintf( stderr, "%d-%d, ns: %f->%f UP!\n", clus1, clus2, naivescore0, naivescore1 );
+                                               else if( naivescore1 < naivescore0 )
+                                                       fprintf( stderr, "%d-%d, ns: DOWN! %f->%f\n", clus1, clus2, naivescore0, naivescore1 );
+                                               else
+                                                       fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+#if 0 // chuui
+                                               if( abs( wm - naivescore1 ) > 100 )
+                                               {
+//                                                     fprintf( stderr, "WARNING, wm=%f but naivescore=%f\n", wm, naivescore1 );
+                                                       rewind( stdout );
+                                                       for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+                                                       for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+                                                       exit( 1 );
+                                               }
+#endif
+                                       }
+                                       else if( alg == 'H' )
+                                       {
+                                                       float wm;
+                                               imp_match_init_strictH( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 ); // Ichijiteki, gapmap ha mada
+                                               wm = H__align( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, localhomshrink, &impmatch, NULL, NULL, NULL, NULL );
+                                               fprintf( stderr, "##### impmatch = %f->%f\n", oimpmatch, impmatch );
+                                               naivescore1 = naivepairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty ) + impmatch;
+                                               fprintf( stderr, "##### naivscore1 = %f\n", naivescore1 );
+
+                                               if( naivescore1 > naivescore0 )
+                                                       fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                               else if( naivescore1 < naivescore0 )
+                                                       fprintf( stderr, "%d-%d, ns: DOWN! %f->%f\n", clus1, clus2, naivescore0, naivescore1 );
+                                               else
+                                                       fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+#if 0 // chuui
+                                               if( abs( wm - naivescore1 ) > 100 )
+                                               {
+//                                                     fprintf( stderr, "WARNING, totalwm=%f but naivescore=%f\n", totalwm, naivescore1 );
+//                                                     for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+//                                                     for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+//                                                     exit( 1 );
+                                               }
+#endif
+                                       }
+                                       else
+                                       {
+//                                             imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+                                               A__align_gapmap( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, localhomshrink, &impmatch, gapmap1, gapmap2 );
+                                               fprintf( stderr, "A__align_gapmap\n" );
+//                                             fprintf( stderr, "##### impmatch = %f\n", impmatch );
+                                       }
+                               }
+                       }
+                       else if( use_fft )
+                       {
+                               float totalwm;
+                               chudanres = 0;
+                               totalwm = Falign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, &intdum, subgenerationpt, subgenerationatfirst, &chudanres );
+                               if( chudanres && parallelizationstrategy == BAATARI2 )
+                               {
+//                                     fprintf( stderr, "#### yarinaoshi!!! FFT-NS-i\n" );
+                                       goto yarinaoshi;
+                               }
+
+//                             fprintf( stderr, "totalwm = %f\n", totalwm );
+#if 0
+                               if( alg == 'Q' )
+                               {
+                                       fprintf( stderr, "totalwm = %f\n", totalwm );
+                                       naivescore1 = naiveQpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty );
+
+                                       if( naivescore1 > naivescore0 )
+                                               fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                       else if( naivescore1 < naivescore0 )
+                                               fprintf( stderr, "%d-%d, ns: DOWN! %f->%f\n", clus1, clus2, naivescore0, naivescore1 );
+                                       else
+                                               fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+#if 1 // chuui
+                                       if( totalwm != 0.0 && abs( totalwm - naivescore1 ) > 100 )
+                                       {
+//                                             fprintf( stderr, "WARNING, totalwm=%f but naivescore=%f\n", totalwm, naivescore1 );
+//                                             for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+//                                             for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+//                                             exit( 1 );
+                                       }
+#endif
+                               }
+#endif
+                               if( alg == 'R' )
+                               {
+                                       fprintf( stderr, "totalwm = %f\n", totalwm );
+                                       naivescore1 = naiveRpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty );
+
+                                       if( naivescore1 > naivescore0 )
+                                               fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                       else if( naivescore1 < naivescore0 )
+                                               fprintf( stderr, "%d-%d, ns: DOWN! %f->%f\n", clus1, clus2, naivescore0, naivescore1 );
+                                       else
+                                               fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+#if 1 // chuui
+                                       if( totalwm != 0.0 && abs( totalwm - naivescore1 ) > 100 )
+                                       {
+//                                             fprintf( stderr, "WARNING, totalwm=%f but naivescore=%f\n", totalwm, naivescore1 );
+//                                             for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+//                                             for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+//                                             exit( 1 );
+                                       }
+                               }
+#endif
+                       }
+                       else
+                       {
+                               if( alg == 'M' )
+                               {
+                                       chudanres = 0;
+                                       MSalignmm( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, NULL, NULL, NULL, NULL, subgenerationpt, subgenerationatfirst, &chudanres, outgap, outgap );
+                                       if( chudanres && parallelizationstrategy == BAATARI2 )
+                                       {
+//                                             fprintf( stderr, "#### yarinaoshi!!! NW-NS-i\n" );
+                                               goto yarinaoshi;
+                                       }
+                               }
+                               else if( alg == 'A' )
+                               {
+                                       A__align( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, NULL, &impmatch, NULL, NULL, NULL, NULL, NULL, 0, NULL, 1, 1 ); //outgap==1
+                               }
+                               else if( alg == 'Q' )
+                               {
+                                       float wm;
+                                       wm = Q__align( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, NULL, &impmatch, NULL, NULL, NULL, NULL );
+                                       fprintf( stderr, "wm = %f\n", wm );
+                                       fprintf( stderr, "impmatch = %f\n", impmatch );
+                                       naivescore1 = naiveQpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty );
+
+                                       if( naivescore1 > naivescore0 )
+                                               fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                       else if( naivescore1 < naivescore0 )
+                                               fprintf( stderr, "%d-%d, ns: DOWN!\n", clus1, clus2 );
+                                       else
+                                               fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+#if 1 // chuui
+                                       if( abs( wm - naivescore1 ) > 100 )
+                                       {
+//                                             fprintf( stderr, "WARNING, wm=%f but naivescore=%f\n", wm, naivescore1 );
+//                                             rewind( stderr );
+//                                             rewind( stdout );
+//                                             for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+//                                             for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+//                                             exit( 1 );
+                                       }
+#endif
+                               }
+                               else if( alg == 'R' )
+                               {
+                                       float wm;
+                                       wm = R__align( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, NULL, &impmatch, NULL, NULL, NULL, NULL );
+                                       naivescore1 = naiveRpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty );
+
+                                       if( naivescore1 > naivescore0 )
+                                               fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                       else if( naivescore1 < naivescore0 )
+                                               fprintf( stderr, "%d-%d, ns: DOWN! %f->%f\n", clus1, clus2, naivescore0, naivescore1 );
+                                       else
+                                               fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+#if 1 // chuui
+                                       if( abs( wm - naivescore1 ) > 100 )
+                                       {
+//                                             fprintf( stderr, "WARNING, wm=%f but naivescore=%f\n", wm, naivescore1 );
+//                                             rewind( stderr );
+//                                             rewind( stdout );
+//                                             for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+//                                             for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+//                                             exit( 1 );
+                                       }
+#endif
+                               }
+                               else if( alg == 'H' )
+                               {
+                                       float wm;
+                                       wm = H__align( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, NULL, &impmatch, NULL, NULL, NULL, NULL );
+                                       naivescore1 = naivepairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty );
+
+                                       if( naivescore1 > naivescore0 )
+                                               fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                       else if( naivescore1 < naivescore0 )
+                                       {
+                                               fprintf( stderr, "%d-%d, ns: DOWN!\n", clus1, clus2 );
+                                       }
+                                       else
+                                               fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+
+#if 0 // chuui
+                                       if( abs( wm - naivescore1 ) > 100 )
+                                       {
+                                               rewind( stdout );
+                                               for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+                                               for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+                                               exit( 1 );
+                                       }
+#endif
+                               }
+                               else if( alg == 'a' ) 
+                               {
+                                       Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen );
+                               }
+                               else ErrorExit( "Sorry!" );
+                       }
+//                     fprintf( stderr, "## impmatch = %f\n", impmatch );
+
+#if 1
+                       if( parallelizationstrategy == BAATARI2 && *subgenerationpt != subgenerationatfirst )
+                       {
+//                             fprintf( stderr, "\nYarinaoshi2!! (Thread %d)\n", thread_no );
+                               goto yarinaoshi;
+                       }
+#endif
+                                               
+                       identity = !strcmp( localcopy[s1], mastercopy[s1] );
+                       identity *= !strcmp( localcopy[s2], mastercopy[s2] );
+
+
+/* Bug?  : idnetitcal but score change when scoreing mtx != JTT  */
+
+                       length = strlen( mseq1[0] );
+
+                       if( identity )
+                       {
+                               tscore = mscore;
+//                             if( !devide ) fprintf( trap_g, "tscore =  %f   identical.\n", tscore );
+//                             fprintf( stderr, " identical." );
+                               fprintf( stderr, "%03d-%04d-%d (thread %4d) identical     \r", iterate+1, *ndonept, k, thread_no );
+                       }
+                       else
+                       {
+                               if( score_check )
+                               {
+                                       if( constraint == 2 )
+                                       {
+#if 1
+                                               if( RNAscoremtx == 'r' )
+                                                       intergroup_score_gapnomi( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble );
+                                               else
+                                                       intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble );
+#else
+                                               intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble );
+#endif
+
+                                               tscore = impmatch + tmpdouble;
+
+//                                             fprintf( stderr, "tmpdouble=%f, impmatch = %f -> %f, tscore = %f\n", tmpdouble, oimpmatch, impmatch, tscore );
+                                       }
+                                       else
+                                       {
+                                               intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble );
+                                               tscore = tmpdouble;
+                                       }
+//                                     fprintf( stderr, "#######ii=%d, iterate=%d score = %f -> %f \n", ii, iterate , mscore, tscore );
+       #if 0
+                                       for( i=0; i<1; i++ )
+                                               fprintf( stderr, "%s\n", mseq1[i] );
+                                       fprintf( stderr, "+++++++\n" );
+                                       for( i=0; i<1; i++ )
+                                               fprintf( stderr, "%s\n", mseq2[i] );
+       #endif
+
+                               }
+                               else
+                               {
+                                       tscore = mscore + 1.0;
+//                                     tscore = 0.0;
+//                                     fprintf( stderr, "in line 705, tscore=%f\n", tscore );
+//                                     for( i=0; i<length; i++ )
+//                                             tscore = tscore + (double)mseq1[0][i];
+//                                     mscore = tscore - 1.0;
+                               }
+
+                               if( isnan( mscore ) )
+                               {
+                                       fprintf( stderr, "\n\nmscore became NaN\n" );
+                                       exit( 1 );
+                               }
+                               if( isnan( tscore ) )
+                               {
+                                       fprintf( stderr, "\n\ntscore became NaN\n" );
+                                       exit( 1 );
+                               }
+
+
+
+//                             fprintf( stderr, "@@@@@ mscore,tscore = %f,%f\n", mscore, tscore );
+
+#if 1
+                               if( parallelizationstrategy == BAATARI1 && *subgenerationpt != subgenerationatfirst )
+                               {
+//                                     fprintf( stderr, "\nYarinaoshi1!! (Thread %d)\n", thread_no );
+                                       goto yarinaoshi;
+                               }
+#endif
+                               gain = tscore - ( mscore - cut/100.0*mscore );
+                               if( gain > 0 )
+                               {
+                                       if( parallelizationstrategy == BESTFIRST )
+                                       {
+                                               if( gain > gainlist[thread_no] ) 
+                                               {
+                                                       gainlist[thread_no] = gain;
+                                                       for( i=0; i<locnjob; i++ ) strcpy( candidates[thread_no][i], localcopy[i] );
+                                                       tscorelist[thread_no] = tscore;
+//                                             if( iterate == 0 ) fprintf( stderr, "hist %d-%d-%d, gain=%f (Thread %d)\n", iterate, l, k, gain, thread_no );
+                                               }
+                                       }
+                                       else
+                                       {
+                                               pthread_mutex_lock( targ->mutex );
+                                               for( i=0; i<locnjob; i++ ) strcpy( mastercopy[i], localcopy[i] );
+                                               *subgenerationpt += 1;
+                                               gainlist[thread_no] = *basegainpt + gain;
+                                               *basegainpt += gain;
+
+                                               if( scoreout )
+                                               {
+                                                       unweightedspscore = plainscore( locnjob, localcopy );
+                                                       fprintf( stderr, "\nSCORE %d = %.0f, ", *ntrypt, unweightedspscore );
+                                                       fprintf( stderr, "SCORE / residue = %f", unweightedspscore / ( locnjob * strlen( mastercopy[0] ) ) );
+                                                       if( weight || constraint ) fprintf( stderr, " (differs from the objective score)" );
+                                                       fprintf( stderr, "\n" );
+                                               }
+
+                                               pthread_mutex_unlock( targ->mutex );
+                                               tscorelist[thread_no] = tscore;
+                                       }
+#if 0
+                                       fprintf( stderr, "tscore =  %f   mscore = %f  accepted.\n", tscore, mscore );
+                                       fprintf( stderr, "\nbetter! gain = %f (thread %d)\r", gain, thread_no );
+#else
+                                       fprintf( stderr, "%03d-%04d-%d (thread %4d) better     \r", iterate+1, *ndonept, k, thread_no );
+#endif
+
+                               }
+                               else 
+                               {
+#if 0
+                                       fprintf( stderr, "tscore =  %f   mscore = %f  rejected.\r", tscore, mscore );
+                                       fprintf( stderr, "worse! gain = %f", gain );
+#else
+                                       fprintf( stderr, "%03d-%04d-%d (thread %4d) worse      \r", iterate+1, *ndonept, k, thread_no );
+#endif
+                                       tscore = mscore;
+                               }
+                       }
+                       converged2 = 0;
+                       for( ii=iterate-2; ii>=0; ii-=1 ) 
+                       {
+//                             fprintf( stderr, "Checking tscorehistory %f ?= %f\n", tscore, tscorehistory_detail[ii][branchpos] );
+                               if( tscore == tscorehistory_detail[ii][branchpos] )
+                               {
+                                       converged2 = 1;
+                                       break;
+                               }
+                       }
+                       if( parallelizationstrategy != BESTFIRST && converged2 ) 
+                       {
+//                             fprintf( stderr, "\nFINISH!\n" );
+                               pthread_mutex_lock( targ->mutex );
+                               *finishpt = 1;
+                               pthread_mutex_unlock( targ->mutex );
+                       }
+
+                       tscorehistory_detail[iterate][branchpos] = tscore;
+                       fprintf( stderr, "\r" );
+
+                       pthread_mutex_lock( targ->mutex );
+                       (*ndonept)++;
+//                     fprintf( stderr, "*ndonept = %d, nbranch = %d (thread %d) iterate=%d\n", *ndonept, nbranch, thread_no, iterate );
+                       generationofinput[branchpos] = iterate;
+                       if( *ndonept == nbranch )
+                       {
+                               if( *collectingpt != -1 ) *collectingpt = 1; // chofuku
+//                             fprintf( stderr, "Thread %d sends a signal, *ndonept = %d\n", thread_no, *ndonept );
+                               pthread_cond_signal( targ->collection_start );
+                       }
+                       pthread_mutex_unlock( targ->mutex );
+               }            /* while( 1 ) */
+
+       }                  /* for( iterate ) */
+//     return( NULL );
+}
+#endif
+
+
+int TreeDependentIteration( int locnjob, char **name, int nlen[M], 
+                             char **aseq, char **bseq, int ***topol, double **len, 
+                             int alloclen, LocalHom **localhomtable, 
+                                                        RNApair ***singlerna,
+                                                        int nkozo, char *kozoarivec )
+{
+       int i, j, k, l, iterate, ii, iu, ju;
+       int lin, ldf, length; 
+       int clus1, clus2;
+       int s1, s2;
+       static double **imanoten;
+       static Node *stopol;
+       static double *effarrforlocalhom = NULL;
+       static double *effarr = NULL;
+       static double *effarr1 = NULL;
+       static double *effarr2 = NULL;
+       static double *effarr_kozo = NULL;
+       static double *effarr1_kozo = NULL;
+       static double *effarr2_kozo = NULL;
+       static double **mtx = NULL;
+       static int **node = NULL;
+       static int *branchnode = NULL;
+       static double **branchWeight = NULL;
+       static char **mseq1, **mseq2;
+       static float ***history;
+       FILE *trap;
+       double tscore, mscore;
+       int identity;
+       int converged;
+       int oscillating;
+       float naivescore0 = 0.0; // by D.Mathog, a guess
+       float naivescore1;
+#if 0
+       char pair[njob][njob];
+#else
+       static char **pair;
+#endif
+#if DEBUG + RECORD
+       double score_for_check0, score_for_check1;
+       static double **effmtx = NULL;
+       extern double score_calc0();
+#endif
+       static char *indication1, *indication2;
+       static LocalHom ***localhomshrink = NULL;
+       float impmatch = 0.0, oimpmatch = 0.0;
+       static int *gapmap1;
+       static int *gapmap2;
+       double tmpdouble;
+       int intdum;
+       static RNApair *rnapairboth;
+       RNApair ***grouprna1, ***grouprna2;
+       double unweightedspscore;
+
+       if( rnakozo && rnaprediction == 'm' )
+       {
+               grouprna1 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) );
+               grouprna2 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) );
+       }
+       else
+       {
+               grouprna1 = grouprna2 = NULL;
+       }
+
+       Writeoptions( trap_g );
+       fflush( trap_g );
+
+       if( effarr == NULL ) /* locnjob == njob ni kagiru */
+       {
+               indication1 = AllocateCharVec( njob*3+50 );
+               indication2 = AllocateCharVec( njob*3+50 );
+               effarr = AllocateDoubleVec( locnjob );
+               effarrforlocalhom = AllocateDoubleVec( locnjob );
+               effarr1 = AllocateDoubleVec( locnjob );
+               effarr2 = AllocateDoubleVec( locnjob );
+               mseq1 = AllocateCharMtx( locnjob, 0 );
+               mseq2 = AllocateCharMtx( locnjob, 0 );
+               mtx = AllocateDoubleMtx( locnjob, locnjob );
+               node = AllocateIntMtx( locnjob, locnjob );
+               branchnode = AllocateIntVec( locnjob );
+               branchWeight = AllocateDoubleMtx( locnjob, 2 );
+               history = AllocateFloatCub( niter, locnjob, 2 );
+               stopol = (Node *)calloc( locnjob * 2, sizeof( Node ) );
+               gapmap1 = AllocateIntVec( alloclen );
+               gapmap2 = AllocateIntVec( alloclen );
+               if( score_check == 2 ) imanoten = AllocateDoubleMtx( njob, njob );
+
+               effarr1_kozo = AllocateDoubleVec( locnjob ); // tsuneni allocate suru.
+               effarr2_kozo = AllocateDoubleVec( locnjob ); // tsuneni allocate suru.
+               effarr_kozo = AllocateDoubleVec( locnjob ); 
+               for( i=0; i<locnjob; i++ )
+                       effarr_kozo[i] = effarr1_kozo[i] = effarr2_kozo[i] = 0.0;
+
+#if 0
+#else
+               pair = AllocateCharMtx( locnjob, locnjob );
+               if( rnakozo ) rnapairboth = (RNApair *)calloc( alloclen, sizeof( RNApair ) );
+
+               if( constraint )
+               {
+                       localhomshrink = (LocalHom ***)calloc( njob, sizeof( LocalHom ** ) );
+                       for( i=0; i<njob; i++)
+                       {
+                               localhomshrink[i] = (LocalHom **)calloc( njob, sizeof( LocalHom * ) );
+                       }
+               }
+#endif
+       }
+#if DEBUG + RECORD
+       if( !effmtx ) effmtx = AllocateDoubleMtx( locnjob, locnjob );
+       for( i=0; i<locnjob; i++ ) for( j=0; j<locnjob; j++ ) effmtx[i][j] = 1.0;
+#endif
+
+       for( i=0; i<locnjob; i++ ) strcpy( bseq[i], aseq[i] );
+
+       writePre( locnjob, name, nlen, aseq, 0 );
+
+       if( utree )
+       {
+               if( constraint )
+               {
+                       counteff_simple( locnjob, topol, len, effarrforlocalhom );
+                       calcimportance( locnjob, effarrforlocalhom, aseq, localhomtable );
+               }
+
+               if( weight == 2 ) 
+               {
+                       countnode_int( locnjob, topol, node );
+                       if( nkozo )
+                       {
+                               fprintf( stderr, "Not supported, weight=%d nkozo=%d.\n", weight, nkozo );
+                       }
+               }
+               else if( weight == 4 )
+               {
+                       treeCnv( stopol, locnjob, topol, len, branchWeight );
+                       calcBranchWeight( branchWeight, locnjob, stopol, topol, len );
+               }
+       }
+
+#ifdef enablemultithread
+       if( nthread > 0 )
+       {
+               threadarg_t *targ;
+               pthread_t *handle;
+               pthread_mutex_t mutex;
+               pthread_cond_t collection_end;
+               pthread_cond_t collection_start;
+               int jobposint;
+               int generationofmastercopy;
+               int subgeneration;
+               float basegain;
+               int *generationofinput;
+               float *gainlist;
+               float *tscorelist;
+               int ndone;
+               int ntry;
+               int collecting;
+               int nbranch;
+               int maxiter;
+               char ***candidates;
+               int *branchtable;
+               float **tscorehistory_detail;
+               int finish;
+
+               nwa = nthread + 1;
+               nbranch = (njob-1) * 2 - 1;
+               maxiter = niter;
+
+               targ = calloc( nwa, sizeof( threadarg_t ) );
+               handle = calloc( nwa, sizeof( pthread_t ) );
+               pthread_mutex_init( &mutex, NULL );
+               pthread_cond_init( &collection_end, NULL );
+               pthread_cond_init( &collection_start, NULL );
+
+               gainlist = calloc( nwa, sizeof( float ) );
+               tscorelist = calloc( nwa, sizeof( float ) );
+               branchtable = calloc( nbranch, sizeof( int ) );
+               generationofinput = calloc( nbranch, sizeof( int ) );
+               if( parallelizationstrategy == BESTFIRST )
+                       candidates = AllocateCharCub( nwa, locnjob, alloclen );
+               for( i=0; i<nbranch; i++ ) branchtable[i] = i;
+               tscorehistory_detail = AllocateFloatMtx( maxiter, nbranch );
+
+               collecting = 1;
+
+               for( i=0; i<nwa; i++ )
+               {
+                       targ[i].thread_no = i;
+                       targ[i].njob = njob;
+                       targ[i].nbranch = nbranch;
+                       targ[i].maxiter = maxiter;
+                       targ[i].ndonept = &ndone;
+                       targ[i].ntrypt = &ntry;
+                       targ[i].collectingpt = &collecting;
+                       targ[i].jobposintpt = &jobposint;
+                       targ[i].gainlist = gainlist;
+                       targ[i].tscorelist = tscorelist;
+                       targ[i].nkozo = nkozo;
+                       targ[i].kozoarivec = kozoarivec;
+                       targ[i].mastercopy = bseq;
+                       targ[i].candidates = candidates;
+                       targ[i].subgenerationpt = &subgeneration;
+                       targ[i].basegainpt = &basegain;
+                       targ[i].generationofmastercopypt = &generationofmastercopy;
+                       targ[i].generationofinput = generationofinput;
+                       targ[i].branchtable = branchtable;
+                       targ[i].singlerna = singlerna;
+                       targ[i].localhomtable = localhomtable;
+                       targ[i].alloclen = alloclen;
+                       targ[i].stopol = stopol;
+                       targ[i].topol = topol;
+//                     targ[i].len = len;
+                       targ[i].mutex = &mutex;
+                       targ[i].collection_end = &collection_end;
+                       targ[i].collection_start = &collection_start;
+                       targ[i].tscorehistory_detail = tscorehistory_detail;
+                       targ[i].finishpt = &finish;
+       
+                       pthread_create( handle+i, NULL, athread, (void *)(targ+i) );
+               }
+
+               for( i=0; i<nwa; i++ )
+               {
+                       pthread_join( handle[i], NULL );
+               }
+
+               pthread_mutex_destroy( &mutex );
+               pthread_cond_destroy( &collection_end );
+               pthread_cond_destroy( &collection_start );
+
+               free( targ );
+               free( handle );
+               free( gainlist );
+               free( tscorelist );
+               free( branchtable );
+               free( generationofinput );
+               if( parallelizationstrategy == BESTFIRST )
+                       FreeCharCub( candidates );
+               FreeFloatMtx( tscorehistory_detail );
+       }
+       else
+#endif
+       {
+#if 0
+               int *branchtable;
+               int jobpos;
+               int myjob;
+
+               int nbranch;
+               nbranch = (njob-1) * 2 - 1;
+
+               branchtable = calloc( nbranch, sizeof( int ) );
+               for( i=0; i<nbranch; i++ ) branchtable[i] = i;
+
+               srand( randomseed );
+#endif
+
+               if( parallelizationstrategy == BESTFIRST )
+               {
+                       fprintf( stderr, "Not implemented.  Try --thread 1 --bestfirst\n" );
+                       exit( 1 );
+               }
+               converged = 0;
+               if( cooling ) cut *= 2.0;
+               for( iterate = 0; iterate<niter; iterate++ ) 
+               {
+                       if( cooling ) cut *= 0.5; /* ... */
+
+#if 0
+                       if( randomseed != 0 ) shuffle( branchtable, nbranch );
+#endif
+       
+                       fprintf( trap_g, "\n" );
+                       Writeoption2( trap_g, iterate, cut );
+                       fprintf( trap_g, "\n" );
+
+       
+                       if( utree == 0 )
+                       {
+                               if( nkozo )
+                               {
+                                       fprintf( stderr, "The combination of dynamic tree and kozo is not supported.\n" );
+                                       exit( 1 );
+                               }
+                               if( devide )
+                               {
+                                       static char *buff1 = NULL;
+                                       static char *buff2 = NULL;
+                                       if( !buff1 )
+                                       {
+                                               buff1 = AllocateCharVec( alloclen );
+                                               buff2 = AllocateCharVec( alloclen );
+                                       }       
+       
+                                       for( i=0; i<locnjob-1; i++ ) for( j=i+1; j<locnjob; j++ )       
+                                       {
+                                               buff1[0] = buff2[0] = 0;
+                                               strcat( buff1, res_g[i] ); strcat( buff2, res_g[j] );
+                                               strcat( buff1,  bseq[i] ); strcat( buff2,  bseq[j] );
+                                               strcat( buff1, seq_g[i] ); strcat( buff2, seq_g[j] );
+       
+                                               mtx[i][j] = (double)substitution_hosei( buff1, buff2 );
+                                       }
+                               }
+                               else
+                               {
+                                       for( i=0; i<locnjob-1; i++ ) for( j=i+1; j<locnjob; j++ )       
+                                               mtx[i][j] = (double)substitution_hosei( bseq[i], bseq[j] );
+                               }
+       
+                               if     ( treemethod == 'n' )
+                                       nj( locnjob, mtx, topol, len );
+                               else if( treemethod == 's' )
+                                       spg( locnjob, mtx, topol, len );
+                               else if( treemethod == 'X' )
+                                       supg( locnjob, mtx, topol, len );
+                               else if( treemethod == 'p' )
+                                       upg2( locnjob, mtx, topol, len );
+                               /* veryfastsupg\e$B$O!":#$N$H$3$m;H$($^$;$s!#\e(B*/
+                               /* \e$B=gHV$NLdBj$,$"$k$N$G\e(B                  */
+       
+                               if( weight == 2 )
+                                       countnode_int( locnjob, topol, node );
+                               else if( weight == 4 )
+                               {
+                                       treeCnv( stopol, locnjob, topol, len, branchWeight );
+                                       calcBranchWeight( branchWeight, locnjob, stopol, topol, len );
+                               }
+                               trap = fopen( "hat2", "w" );
+                               if( !trap ) ErrorExit( "Cannot open hat2." );
+                               WriteHat2_pointer( trap, locnjob, name, mtx );
+                               fclose( trap );
+                               if( constraint )
+                               {
+                                       counteff_simple( locnjob, topol, len, effarrforlocalhom );
+                                       calcimportance( locnjob, effarrforlocalhom, aseq, localhomtable );
+                               }
+                       }
+       
+                       if( iterate % 2 == 0 ) 
+                       {
+                               lin = 0; ldf = +1;
+                       }
+                       else
+                       {
+                               lin = locnjob - 2; ldf = -1;
+                       }       
+       
+                       if( score_check == 2 )
+                       {
+                               effarr1[0] = 1.0;
+                               effarr2[0] = 1.0;
+                               length = strlen( bseq[0] );
+                               for( i=0; i<locnjob-1; i++ )
+                                       for( j=i+1; j<locnjob; j++ )
+                                               intergroup_score( bseq+i, bseq+j, effarr1, effarr2, 1, 1, length, imanoten[i]+j );
+                       }
+       
+#if 1
+                       for( l=lin; l < locnjob-1 && l >= 0 ; l+=ldf )
+                       {
+
+
+                               for( k=0; k<2; k++ ) 
+                               {
+                                       if( l == locnjob-2 ) k = 1;
+#else
+
+                       for( jobpos=0; jobpos<nbranch; jobpos++)
+                       {
+                               {
+                                       myjob = branchtable[jobpos];
+                                       l = myjob / 2;
+                                       if( l == locnjob-2 ) k = 1;
+                                       else k = myjob - l * 2;
+#endif
+       #if 1
+                                       fprintf( stderr, "STEP %03d-%03d-%d ", iterate+1, l+1, k );
+                                       fflush( stderr );
+       #else
+                                       fprintf( stderr, "STEP %03d-%03d-%d %s", iterate+1, l+1, k, use_fft?"\n":"\n" );
+       #endif
+                                       for( i=0; i<locnjob; i++ ) for( j=0; j<locnjob; j++ ) pair[i][j] = 0;
+       
+                                       OneClusterAndTheOther( locnjob, pair, &s1, &s2, topol, l, k );
+       #if 0
+                                       fprintf( stderr, "STEP%d-%d\n", l, k );
+                                       for( i=0; i<locnjob; i++ ) 
+                                       {
+                                               for( j=0; j<locnjob; j++ ) 
+                                               {
+                                                       fprintf( stderr, "%#3d", pair[i][j] );
+                                               }
+                                               fprintf( stderr, "\n" );
+                                       }
+       #endif
+                                       if( !weight )
+                                       {
+                                               for( i=0; i<locnjob; i++ ) effarr[i] = 1.0;
+                                               if( nkozo )
+                                               {
+                                                       for( i=0; i<locnjob; i++ ) 
+                                                       {
+                                                               if( kozoarivec[i] )
+                                                                       effarr_kozo[i] = 1.0;
+                                                               else
+                                                                       effarr_kozo[i] = 0.0;
+                                                       }
+                                               }
+                                       }
+                                       else if( weight == 2 ) 
+                                       {
+                                               nodeFromABranch( locnjob, branchnode, node, topol, len, l, k );
+                                               node_eff( locnjob, effarr, branchnode );
+                                       }
+                                       else if( weight == 4 )
+                                       {
+                                               weightFromABranch( locnjob, effarr, stopol, topol, l, k );
+       #if 0
+                                               if( nkozo )
+                                               {
+                                                       assignstrweight( locnjob, effarr_kozo, stopol, topol, l, k, kozoarivec, effarr );
+                                               }
+       
+       #else
+                                               if( nkozo ) // hitomadu single weight.
+                                                       for( i=0; i<locnjob; i++ ) 
+                                                       {
+                                                               if( kozoarivec[i] ) effarr_kozo[i] = effarr[i]; 
+                                                               else effarr_kozo[i] = 0.0;
+                                                       }
+       #endif
+       #if 0
+                                               fprintf( stderr, "\n" );
+                                               fprintf( stderr, "effarr_kozo = \n" );
+                                               for( i=0; i<locnjob; i++ ) fprintf( stderr, "%5.3f ", effarr_kozo[i] );
+                                               fprintf( stderr, "\n" );
+                                               fprintf( stderr, "effarr = \n" );
+                                               for( i=0; i<locnjob; i++ ) fprintf( stderr, "%5.3f ", effarr[i] );
+                                               fprintf( stderr, "\n\n" );
+       #endif
+                                       }
+       
+                                       for( i=0; i<locnjob; i++ ) strcpy( aseq[i], bseq[i] );
+                                       length = strlen( aseq[0] );
+       
+                                       if( nkozo )
+                                       {
+       #if 1
+                                               double tmptmptmp;
+                                               tmptmptmp = 0.0;
+                                               clus1 = conjuctionfortbfast_kozo( &tmptmptmp, pair, s1, aseq, mseq1, effarr1, effarr, effarr1_kozo, effarr_kozo, indication1 );
+                                               for( i=0; i<clus1; i++ ) effarr1_kozo[i] *= 1.0; // 0.5 ga sairyo ?
+                                               tmptmptmp = 0.0;
+                                               clus2 = conjuctionfortbfast_kozo( &tmptmptmp, pair, s2, aseq, mseq2, effarr2, effarr, effarr2_kozo, effarr_kozo, indication2 );
+                                               for( i=0; i<clus2; i++ ) effarr2_kozo[i] *= 1.0; // 0.5 ga sairyo ?
+       
+       #if 0
+                                               fprintf( stderr, "\ngroup1 = %s\n", indication1 );
+                                               for( i=0; i<clus1; i++ ) fprintf( stderr, "effarr1_kozo[%d], effarr1[]  = %f, %f\n", i, effarr1_kozo[i], effarr1[i] );
+                                               fprintf( stderr, "\ngroup2 = %s\n", indication2 );
+                                               for( i=0; i<clus2; i++ ) fprintf( stderr, "effarr2_kozo[%d], effarr2[]  = %f, %f\n", i, effarr2_kozo[i], effarr2[i] );
+       #endif
+       
+       
+       
+       
+       
+       #else
+                                               clus1 = conjuctionfortbfast_kozo_BUG( pair, s1, aseq, mseq1, effarr1, effarr, effarr1_kozo, effarr_kozo, indication1 );
+                                               clus2 = conjuctionfortbfast_kozo_BUG( pair, s2, aseq, mseq2, effarr2, effarr, effarr2_kozo, effarr_kozo, indication2 );
+       #endif
+                                       }
+                                       else
+                                       {
+                                               clus1 = conjuctionfortbfast( pair, s1, aseq, mseq1, effarr1, effarr, indication1 );
+                                               clus2 = conjuctionfortbfast( pair, s2, aseq, mseq2, effarr2, effarr, indication2 );
+                                       }
+       
+       
+       
+                               if( rnakozo && rnaprediction == 'm' )
+                               {       
+                                               makegrouprnait( grouprna1, singlerna, pair, s1 );
+                                               makegrouprnait( grouprna2, singlerna, pair, s2 );
+                               }       
+       
+                                       if( score_check == 2 )
+                                       {
+                                               if( constraint )
+                                               {
+       //                                              msshrinklocalhom( pair, s1, s2, localhomtable, localhomshrink );
+                                                       shrinklocalhom( pair, s1, s2, localhomtable, localhomshrink );
+                                                       oimpmatch = 0.0;
+                                                       if( use_fft )
+                                                       {
+                                                               if( alg == 'Q' )
+                                                               {
+                                                                       part_imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 );
+                                                                       if( rnakozo ) part_imp_rnaQ( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL );
+                                                                       for(  i=length-1; i>=0; i-- ) oimpmatch += part_imp_match_out_scQ( i, i );
+                                                               }
+                                                               else
+                                                               {
+                                                                       part_imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+                                                                       if( rnakozo ) part_imp_rna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL );
+                                                                       for(  i=length-1; i>=0; i-- ) oimpmatch += part_imp_match_out_sc( i, i );
+                                                               }
+                                                       }
+                                                       else
+                                                       {
+                                                               if( alg == 'Q' )
+                                                               {
+                                                                       imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 );
+                                                                       if( rnakozo ) imp_rnaQ( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL );
+                                                                       for(  i=length-1; i>=0; i-- ) oimpmatch += imp_match_out_scQ( i, i );
+                                                               }
+                                                               else
+                                                               {
+                                                                       imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+                                                                       fprintf( stderr, "not supported\n" );
+                                                                       exit( 1 );
+                                                               }
+                                                       }
+       //                                              fprintf( stderr, "### oimpmatch = %f\n", oimpmatch );
+                                               }
+                                               else
+                                               {
+                                                       oimpmatch = 0.0;
+                                               }
+                                               tmpdouble = 0.0;
+                                               iu=0; 
+                                               for( i=s1; i<locnjob; i++ ) 
+                                               {
+                                                       if( !pair[s1][i] ) continue;
+                                                       ju=0;
+                                                       for( j=s2; j<locnjob; j++ )
+                                                       {
+                                                               if( !pair[s2][j] ) continue;
+       //                                                      fprintf( stderr, "i = %d, j = %d, effarr1=%f, effarr2=%f\n", i, j, effarr1[iu], effarr2[ju] );
+                                                               tmpdouble += effarr1[iu] * effarr2[ju] * imanoten[MIN(i,j)][MAX(i,j)];
+                                                               ju++;
+                                                       }
+                                                       iu++;
+                                               }
+                                               mscore = oimpmatch + tmpdouble;
+                                       }
+                                       else if( score_check )
+                                       {
+       #if 1
+                                               if( RNAscoremtx == 'r' )
+                                                       intergroup_score_gapnomi( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); // gappick mae denaito dame
+                                               else
+                                                       intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); // gappick mae denaito dame
+       #else
+                                               intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble ); // gappick mae denaito dame
+       #endif
+       
+                                               if( constraint )
+                                               {
+                                                       shrinklocalhom( pair, s1, s2, localhomtable, localhomshrink );
+               //                                      weightimportance4( clus1, clus2,  effarr1, effarr2, localhomshrink ); // >>>
+                                                       oimpmatch = 0.0;
+                                                       if( use_fft )
+                                                       {
+                                                               if( alg == 'Q' )
+                                                               {
+                                                                       part_imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 );
+                                                                       if( rnakozo ) part_imp_rnaQ( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL );
+                                                                       for(  i=length-1; i>=0; i-- )
+                                                                       {
+                                                                               oimpmatch += part_imp_match_out_scQ( i, i );
+       //                                                                      fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] );
+                                                                       }
+                                                               }
+                                                               else
+                                                               {
+                                                                       part_imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+                                                                       if( rnakozo ) part_imp_rna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL );
+                                                                       for(  i=length-1; i>=0; i-- )
+                                                                       {
+                                                                               oimpmatch += part_imp_match_out_sc( i, i );
+               //                                                              fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] );
+                                                                       }
+                                                               }
+               //                                              fprintf( stderr, "otmpmatch = %f\n", oimpmatch );
+                                                       }
+                                                       else
+                                                       {
+                                                               if( alg == 'Q' )
+                                                               {
+                                                                       imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 );
+                                                                       if( rnakozo ) imp_rnaQ( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL );
+       
+                                                                       for(  i=length-1; i>=0; i-- )
+                                                                       {
+                                                                               oimpmatch += imp_match_out_scQ( i, i );
+       //                                                                      fprintf( stderr, "#### i=%d, initial impmatch = %f\n", i, oimpmatch );
+                                                                       }
+                                                               }
+                                                               else
+                                                               {
+                                                                       imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+       
+                                                                       fprintf( stderr, "not supported\n" );
+                                                                       exit( 1 );
+       
+                                                                       for(  i=length-1; i>=0; i-- )
+                                                                       {
+                                                                               oimpmatch += imp_match_out_sc( i, i );
+               //                                                              fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] );
+                                                                       }
+                                                               }
+               //                                              fprintf( stderr, "otmpmatch = %f\n", oimpmatch );
+                                                       }
+               //                                      fprintf( stderr, "#### initial impmatch = %f\n", oimpmatch );
+                                               }
+                                               else
+                                               {
+                                                       oimpmatch = 0.0;
+                                               }
+       
+       
+       //                                      fprintf( stderr, "#### tmpdouble = %f\n", tmpdouble );
+                                               mscore = (double)oimpmatch + tmpdouble;
+                                       }
+                                       else
+                                       {
+       //                                      fprintf( stderr, "score_check = %d\n", score_check );
+       /* atode kousokuka */
+                                               intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble );
+                                               mscore = tmpdouble;
+       /* atode kousokuka */
+       
+                                               if( constraint )
+                                               {
+                                                       oimpmatch = 0.0;
+                                                       shrinklocalhom( pair, s1, s2, localhomtable, localhomshrink );
+                                                       if( use_fft )
+                                                       {
+                                                               if( alg == 'Q' )
+                                                               {
+                                                                       part_imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 );
+                                                                       if( rnakozo ) part_imp_rnaQ( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL );
+                                                               }
+                                                               else
+                                                               {
+                                                                       part_imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+                                                                       if( rnakozo ) part_imp_rna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL );
+                                                               }
+                                                       }
+                                                       else
+                                                       {
+                                                               if( alg == 'Q' )
+                                                               {
+                                                                       imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 );
+                                                                       if( rnakozo ) imp_rnaQ( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, gapmap1, gapmap2, NULL );
+                                                               }
+                                                               else
+                                                               {
+                                                                       imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+                                                                       fprintf( stderr, "Not supported\n" );
+                                                                       exit( 1 );
+                                                               }
+                                                       }
+                                               }
+                                       }
+       
+       //                              oimpmatch = 0.0;
+                                       if( constraint )
+                                       {
+       #if 0 // iranai
+                                               if( alg == 'Q' )
+                                               {
+                                                       imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 );
+                                                       for(  i=length-1; i>=0; i-- )
+                                                       {
+                                                               oimpmatch += imp_match_out_scQ( i, i );
+       //                                                      fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] );
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+                                                       for(  i=length-1; i>=0; i-- )
+                                                       {
+                                                               oimpmatch += imp_match_out_sc( i, i );
+       //                                                      fprintf( stderr, "#### i=%d, initial impmatch = %f seq1 = %c, seq2 = %c\n", i, oimpmatch, mseq1[0][i], mseq2[0][i] );
+                                                       }
+                                               }
+       #endif
+                                       }
+       #if 0
+                                       if( alg == 'H' )
+                                               naivescore0 = naivepairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty ) + oimpmatch;
+                                       else if( alg == 'Q' )
+                                               naivescore0 = naiveQpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty ) + oimpmatch;
+                                       else if( alg == 'R' )
+                                               naivescore0 = naiveRpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty ) + oimpmatch;
+       #endif
+       
+       //                              if( rnakozo ) foldalignedrna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, rnapairboth );
+       
+       //                              if( !use_fft && !rnakozo )
+                                       if( !use_fft )
+                                       {
+                                               commongappick_record( clus1, mseq1, gapmap1 );
+                                               commongappick_record( clus2, mseq2, gapmap2 );
+                                       }
+       
+       #if 0
+                                       fprintf( stderr, "##### mscore = %f\n", mscore );
+       #endif
+               
+       #if DEBUG
+                                       if( !devide )
+                                       {
+                                       fprintf( trap_g, "\nSTEP%d-%d-%d\n", iterate+1, l+1, k );
+                               fprintf( trap_g, "group1 = %s\n", indication1 );
+                                       fprintf( trap_g, "group2 = %s\n", indication2 );
+                                               fflush( trap_g );
+                                       }
+               
+       #endif
+       #if 0
+                                       printf( "STEP %d-%d-%d\n", iterate, l, k );
+                                       for( i=0; i<clus2; i++ ) printf( "%f ", effarr2[i] );
+                                       printf( "\n" );
+       #endif
+                                       if( constraint == 2 )
+                                       {
+                                               if( use_fft )
+                                               {
+       //                                              if( alg == 'Q' )
+       //                                                      part_imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 );
+       //                                              else
+       //                                                      part_imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+                                                       Falign_localhom( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, localhomshrink, &impmatch, gapmap1, gapmap2, NULL, 0, NULL );
+       //                                              fprintf( stderr, "##### impmatch = %f\n", impmatch );
+                                               }
+                                               else
+                                               {
+                                                       if( alg == 'Q' )
+                                                       {
+                                                               float wm;
+       //                                                      imp_match_init_strictQ( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 ); // Ichijiteki, gapmap  wo tsukuttakara iranai.
+       //                                                      if( rnakozo ) imp_rnaQ( clus1, clus2, mseq1, mseq2, effarr1, effarr2, gapmap1, gapmap2, rnapairboth );
+       
+                                                               wm = Q__align_gapmap( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, localhomshrink, &impmatch, NULL, NULL, NULL, NULL, gapmap1, gapmap2 );
+                                                               fprintf( stderr, "wm = %f\n", wm );
+       #if 0
+                                                               fprintf( stderr, "##### impmatch = %f->%f\n", oimpmatch, impmatch );
+                                                               naivescore1 = naiveQpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty ) + impmatch;
+                                                               fprintf( stderr, "##### naivscore1 = %f\n", naivescore1 );
+       
+                                                               if( naivescore1 > naivescore0 )
+                                                                       fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                                               else if( naivescore1 < naivescore0 )
+                                                                       fprintf( stderr, "%d-%d, ns: DOWN! %f->%f\n", clus1, clus2, naivescore0, naivescore1 );
+                                                               else
+                                                                       fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+       #if 0 // chuui
+                                                               if( abs( wm - naivescore1 ) > 100 )
+                                                               {
+       //                                                              fprintf( stderr, "WARNING, wm=%f but naivescore=%f\n", wm, naivescore1 );
+       //                                                              rewind( stdout );
+       //                                                              for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+       //                                                              for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+       //                                                              exit( 1 );
+                                                               }
+       #endif
+       #endif
+                                                       }
+                                                       else if( alg == 'R' )
+                                                       {
+                                                               float wm;
+                                                               imp_match_init_strictR( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 ); // Ichijiteki, gapmap ha mada
+                                                               wm = R__align( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, localhomshrink, &impmatch, NULL, NULL, NULL, NULL );
+       //                                                      fprintf( stderr, "##### impmatch = %f->%f\n", oimpmatch, impmatch );
+                                                               naivescore1 = naiveRpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty ) + impmatch;
+       //                                                      fprintf( stderr, "##### naivscore1 = %f\n", naivescore1 );
+       
+                                                               if( naivescore1 > naivescore0 )
+                                                                       fprintf( stderr, "%d-%d, ns: %f->%f UP!\n", clus1, clus2, naivescore0, naivescore1 );
+                                                               else if( naivescore1 < naivescore0 )
+                                                                       fprintf( stderr, "%d-%d, ns: DOWN! %f->%f\n", clus1, clus2, naivescore0, naivescore1 );
+                                                               else
+                                                                       fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+       #if 0 // chuui
+                                                               if( abs( wm - naivescore1 ) > 100 )
+                                                               {
+       //                                                              fprintf( stderr, "WARNING, wm=%f but naivescore=%f\n", wm, naivescore1 );
+                                                                       rewind( stdout );
+                                                                       for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+                                                                       for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+                                                                       exit( 1 );
+                                                               }
+       #endif
+                                                       }
+                                                       else if( alg == 'H' )
+                                                       {
+                                                               float wm;
+                                                               imp_match_init_strictH( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, localhomshrink, 1 ); // Ichijiteki, gapmap ha mada
+                                                               wm = H__align( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, localhomshrink, &impmatch, NULL, NULL, NULL, NULL );
+                                                               fprintf( stderr, "##### impmatch = %f->%f\n", oimpmatch, impmatch );
+                                                               naivescore1 = naivepairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty ) + impmatch;
+                                                               fprintf( stderr, "##### naivscore1 = %f\n", naivescore1 );
+       
+                                                               if( naivescore1 > naivescore0 )
+                                                                       fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                                               else if( naivescore1 < naivescore0 )
+                                                                       fprintf( stderr, "%d-%d, ns: DOWN! %f->%f\n", clus1, clus2, naivescore0, naivescore1 );
+                                                               else
+                                                                       fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+       #if 0 // chuui
+                                                               if( abs( wm - naivescore1 ) > 100 )
+                                                               {
+       //                                                              fprintf( stderr, "WARNING, totalwm=%f but naivescore=%f\n", totalwm, naivescore1 );
+       //                                                              for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+       //                                                              for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+       //                                                              exit( 1 );
+                                                               }
+       #endif
+                                                       }
+                                                       else
+                                                       {
+       //                                                      imp_match_init_strict( NULL, clus1, clus2, length, length, mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, 1 );
+                                                               A__align_gapmap( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, localhomshrink, &impmatch, gapmap1, gapmap2 );
+       //                                                      fprintf( stderr, "##### impmatch = %f\n", impmatch );
+                                                       }
+                                               }
+                                       }
+                                       else if( use_fft )
+                                       {
+                                               float totalwm;
+                                               totalwm = Falign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, &intdum, NULL, 0, NULL );
+       
+       //                                      fprintf( stderr, "totalwm = %f\n", totalwm );
+       #if 0
+                                               if( alg == 'Q' )
+                                               {
+                                                       fprintf( stderr, "totalwm = %f\n", totalwm );
+                                                       naivescore1 = naiveQpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty );
+               
+                                                       if( naivescore1 > naivescore0 )
+                                                               fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                                       else if( naivescore1 < naivescore0 )
+                                                               fprintf( stderr, "%d-%d, ns: DOWN! %f->%f\n", clus1, clus2, naivescore0, naivescore1 );
+                                                       else
+                                                               fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+       #if 1 // chuui
+                                                       if( totalwm != 0.0 && abs( totalwm - naivescore1 ) > 100 )
+                                                       {
+       //                                                      fprintf( stderr, "WARNING, totalwm=%f but naivescore=%f\n", totalwm, naivescore1 );
+       //                                                      for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+       //                                                      for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+       //                                                      exit( 1 );
+                                                       }
+       #endif
+                                               }
+       #endif
+                                               if( alg == 'R' )
+                                               {
+                                                       fprintf( stderr, "totalwm = %f\n", totalwm );
+                                                       naivescore1 = naiveRpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty );
+               
+                                                       if( naivescore1 > naivescore0 )
+                                                               fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                                       else if( naivescore1 < naivescore0 )
+                                                               fprintf( stderr, "%d-%d, ns: DOWN! %f->%f\n", clus1, clus2, naivescore0, naivescore1 );
+                                                       else
+                                                               fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+       #if 1 // chuui
+                                                       if( totalwm != 0.0 && abs( totalwm - naivescore1 ) > 100 )
+                                                       {
+       //                                                      fprintf( stderr, "WARNING, totalwm=%f but naivescore=%f\n", totalwm, naivescore1 );
+       //                                                      for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+       //                                                      for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+       //                                                      exit( 1 );
+                                                       }
+                                               }
+       #endif
+                                       }
+                                       else
+                                       {
+                                               if( alg == 'M' )
+                                               {
+                                                       MSalignmm( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap );
+                                               }
+                                               else if( alg == 'A' )
+                                               {
+                                                       A__align( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, NULL, &impmatch, NULL, NULL, NULL, NULL, NULL, 0, NULL, 1, 1 ); // outgap==1
+                                               }
+                                               else if( alg == 'Q' )
+                                               {
+                                                       float wm;
+                                                       wm = Q__align( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, NULL, &impmatch, NULL, NULL, NULL, NULL );
+                                                       fprintf( stderr, "wm = %f\n", wm );
+                                                       fprintf( stderr, "impmatch = %f\n", impmatch );
+                                                       naivescore1 = naiveQpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty );
+       
+                                                       if( naivescore1 > naivescore0 )
+                                                               fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                                       else if( naivescore1 < naivescore0 )
+                                                               fprintf( stderr, "%d-%d, ns: DOWN!\n", clus1, clus2 );
+                                                       else
+                                                               fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+       #if 1 // chuui
+                                                       if( abs( wm - naivescore1 ) > 100 )
+                                                       {
+       //                                                      fprintf( stderr, "WARNING, wm=%f but naivescore=%f\n", wm, naivescore1 );
+       //                                                      rewind( stderr );
+       //                                                      rewind( stdout );
+       //                                                      for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+       //                                                      for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+       //                                                      exit( 1 );
+                                                       }
+       #endif
+                                               }
+                                               else if( alg == 'R' )
+                                               {
+                                                       float wm;
+                                                       wm = R__align( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, NULL, &impmatch, NULL, NULL, NULL, NULL );
+                                                       naivescore1 = naiveRpairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty );
+       
+                                                       if( naivescore1 > naivescore0 )
+                                                               fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                                       else if( naivescore1 < naivescore0 )
+                                                               fprintf( stderr, "%d-%d, ns: DOWN! %f->%f\n", clus1, clus2, naivescore0, naivescore1 );
+                                                       else
+                                                               fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+       #if 1 // chuui
+                                                       if( abs( wm - naivescore1 ) > 100 )
+                                                       {
+       //                                                      fprintf( stderr, "WARNING, wm=%f but naivescore=%f\n", wm, naivescore1 );
+       //                                                      rewind( stderr );
+       //                                                      rewind( stdout );
+       //                                                      for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+       //                                                      for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+       //                                                      exit( 1 );
+                                                       }
+       #endif
+                                               }
+                                               else if( alg == 'H' )
+                                               {
+                                                       float wm;
+                                                       wm = H__align( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen, NULL, &impmatch, NULL, NULL, NULL, NULL );
+                                                       naivescore1 = naivepairscore( clus1, clus2, mseq1, mseq2, effarr1, effarr2, penalty );
+       
+                                                       if( naivescore1 > naivescore0 )
+                                                               fprintf( stderr, "%d-%d, ns: UP!\n", clus1, clus2 );
+                                                       else if( naivescore1 < naivescore0 )
+                                                       {
+                                                               fprintf( stderr, "%d-%d, ns: DOWN!\n", clus1, clus2 );
+                                                       }
+                                                       else
+                                                               fprintf( stderr, "%d-%d, ns: IDENTICAL\n", clus1, clus2 );
+       
+       #if 0 // chuui
+                                                       if( abs( wm - naivescore1 ) > 100 )
+                                                       {
+                                                               rewind( stdout );
+                                                               for( i=0; i<clus1; i++ ) printf( ">\n%s\n", mseq1[i] );
+                                                               for( i=0; i<clus2; i++ ) printf( ">\n%s\n", mseq2[i] );
+                                                               exit( 1 );
+                                                       }
+       #endif
+                                               }
+                                               else if( alg == 'a' ) 
+                                               {
+                                                       Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, alloclen );
+                                               }
+                                               else ErrorExit( "Sorry!" );
+                                       }
+       //                              fprintf( stderr, "## impmatch = %f\n", impmatch );
+                                                               
+                                               if( checkC )
+                                               {
+                                                       extern double DSPscore();
+                                                       extern double SSPscore();
+                                                       static double cur;
+                                                       static double pre;
+               
+       /*
+                                                       pre = SSPscore( locnjob, bseq );
+                                                       cur = SSPscore( locnjob, aseq );
+       */
+                                                       pre = DSPscore( locnjob, bseq );
+                                                       cur = DSPscore( locnjob, aseq );
+               
+                                                       fprintf( stderr, "Previous Sscore = %f\n", pre );
+                                                       fprintf( stderr, "Currnet  Sscore = %f\n\n", cur );
+                                               }
+                                               
+       //                              fprintf( stderr, "## impmatch = %f\n", impmatch );
+                                       identity = !strcmp( aseq[s1], bseq[s1] );
+                                       identity *= !strcmp( aseq[s2], bseq[s2] );
+       
+       
+       /* Bug?  : idnetitcal but score change when scoreing mtx != JTT  */
+       
+                                       length = strlen( mseq1[0] );
+               
+                                       if( identity )
+                                       {
+                                               tscore = mscore;
+                                               if( !devide ) fprintf( trap_g, "tscore =  %f   identical.\n", tscore );
+                                               fprintf( stderr, " identical." );
+                                               converged++;
+                                       }
+                                       else
+                                       {
+                                               if( score_check )
+                                               {
+                                                       if( constraint == 2 )
+                                                       {
+       #if 1
+                                                               if( RNAscoremtx == 'r' )
+                                                                       intergroup_score_gapnomi( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble );
+                                                               else
+                                                                       intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble );
+       #else
+                                                               intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble );
+       #endif
+       
+                                                               tscore = impmatch + tmpdouble;
+       
+       //                                                      fprintf( stderr, "tmpdouble=%f, impmatch = %f -> %f, tscore = %f\n", tmpdouble, oimpmatch, impmatch, tscore );
+                                                       }
+                                                       else
+                                                       {
+                                                               intergroup_score( mseq1, mseq2, effarr1, effarr2, clus1, clus2, length, &tmpdouble );
+                                                               tscore = tmpdouble;
+                                                       }
+       //                                              fprintf( stderr, "#######ii=%d, iterate=%d score = %f -> %f \n", ii, iterate , mscore, tscore );
+               #if 0
+                                                       for( i=0; i<1; i++ )
+                                                               fprintf( stderr, "%s\n", mseq1[i] );
+                                                       fprintf( stderr, "+++++++\n" );
+                                                       for( i=0; i<1; i++ )
+                                                               fprintf( stderr, "%s\n", mseq2[i] );
+               #endif
+               
+                                               }
+                                               else
+                                               {
+                                                       tscore = mscore + 1.0;
+       //                                              tscore = 0.0;
+       //                                              fprintf( stderr, "in line 705, tscore=%f\n", tscore );
+       //                                              for( i=0; i<length; i++ )
+       //                                                      tscore = tscore + (double)mseq1[0][i];
+       //                                              mscore = tscore - 1.0;
+                                               }
+       
+                                               if( isnan( mscore ) )
+                                               {
+                                                       fprintf( stderr, "\n\nmscore became NaN\n" );
+                                                       exit( 1 );
+                                               }
+                                               if( isnan( tscore ) )
+                                               {
+                                                       fprintf( stderr, "\n\ntscore became NaN\n" );
+                                                       exit( 1 );
+                                               }
+       
+       
+       
+       //                                      fprintf( stderr, "@@@@@ mscore,tscore = %f,%f\n", mscore, tscore );
+       
+                                               if( tscore > mscore - cut/100.0*mscore ) 
+                                               {
+                                                       writePre( locnjob, name, nlen, aseq, 0 );
+                                                       for( i=0; i<locnjob; i++ ) strcpy( bseq[i], aseq[i] );
+                                                       if( score_check == 2 )
+                                                       {
+                                                               effarr1[0] = 1.0;
+                                                               effarr2[0] = 1.0;
+                                                               for( i=0; i<locnjob-1; i++ )
+                                                                       for( j=i+1; j<locnjob; j++ )
+                                                                               intergroup_score( bseq+i, bseq+j, effarr1, effarr2, 1, 1, length, imanoten[i]+j );
+                                                       }
+               
+       #if 0
+                                                       fprintf( stderr, "tscore =  %f   mscore = %f  accepted.\n", tscore, mscore );
+       #endif
+                                                       fprintf( stderr, " accepted." );
+                                                       converged = 0;
+               
+                                               }
+                                               else 
+                                               {
+       #if 0
+                                                       fprintf( stderr, "tscore =  %f   mscore = %f  rejected.\n", tscore, mscore );
+       #endif
+                                                       fprintf( stderr, " rejected." );
+                                                       tscore = mscore;
+                                                       converged++;
+                                               }
+                                       }
+                                       fprintf( stderr, "\r" );
+       
+       
+                                       history[iterate][l][k] = (float)tscore;
+       
+       //                              fprintf( stderr, "tscore = %f\n", tscore );
+               
+                                       if( converged >= locnjob * 2 )
+                                       {
+                                               fprintf( trap_g, "Converged.\n\n" );
+                                               fprintf( stderr, "\nConverged.\n\n" );
+                                               if( scoreout )
+                                               {
+                                                       unweightedspscore = plainscore( njob, bseq );
+                                                       fprintf( stderr, "\nSCORE %d = %.0f, ", iterate * ( (njob-1)*2-1 ), unweightedspscore );
+                                                       fprintf( stderr, "SCORE / residue = %f", unweightedspscore / ( njob * strlen( bseq[0] ) ) );
+                                                       if( weight || constraint ) fprintf( stderr, " (differs from the objective score)" );
+                                                       fprintf( stderr, "\n\n" );
+                                               }
+                                               return( 0 );
+                                       }
+                                       if( iterate >= 1 )
+                                       {
+               /*   oscillation check    */
+                                               oscillating = 0;
+                                               for( ii=iterate-2; ii>=0; ii-=2 ) 
+                                               {
+                                                       if( (float)tscore == history[ii][l][k] )
+                                                       {
+                                                               oscillating = 1;
+                                                               break;
+                                                       }
+                                               }
+                                               if( ( oscillating && !cooling ) || ( oscillating && cut < 0.001 && cooling ) )
+                                               {
+                                                       fprintf( trap_g, "Oscillating.\n" );
+                                                       fprintf( stderr, "\nOscillating.\n\n" );
+                                                       if( scoreout )
+                                                       {
+                                                               unweightedspscore = plainscore( njob, bseq );
+                                                               fprintf( stderr, "\nSCORE %d = %.0f, ", iterate * ( (njob-1)*2-1 ), unweightedspscore );
+                                                               fprintf( stderr, "SCORE / residue = %f", unweightedspscore / ( njob * strlen( bseq[0] ) ) );
+                                                               if( weight || constraint ) fprintf( stderr, " (differs from the objective score)" );
+                                                               fprintf( stderr, "\n\n" );
+                                                       }
+       #if 1 /* hujuubun */
+                                                       return( -1 );
+       #endif
+                                               }
+                                       }      /* if( iterate ) */
+                               }          /* for( k ) */
+                       }              /* for( l ) */
+                       if( scoreout )
+                       {
+                               unweightedspscore = plainscore( njob, bseq );
+                               fprintf( stderr, "\nSCORE %d = %.0f, ", iterate * ( (njob-1)*2-1 ), unweightedspscore );
+                               fprintf( stderr, "SCORE / residue = %f", unweightedspscore / ( njob * strlen( bseq[0] ) ) );
+                               if( weight || constraint ) fprintf( stderr, " (differs from the objective score)" );
+                               fprintf( stderr, "\n\n" );
+                       }
+               }                  /* for( iterate ) */
+       }
+       return( 2 );
+}                         /* int Tree... */