Ejemplo n.º 1
0
static int diff(sint A,sint B,sint M,sint N,sint tb,sint te)
{
  sint type;
  sint midi,midj,i,j;
  int midh;
  static pwint f, hh, e, s, t;
  
  if(N<=0)  {
    if(M>0) {
      del(M);
    }
    
    return(-(int)tbgap(M));
  }
  
  if(M<=1) {
    if(M<=0) {
      add(N);
      return(-(int)tbgap(N));
    }
    
    midh = -(tb+gh) - tegap(N);
    hh = -(te+gh) - tbgap(N);
    if (hh>midh) midh = hh;
    midj = 0;
    for(j=1;j<=N;j++) {
      hh = calc_score(1,j,A,B)
	- tegap(N-j) - tbgap(j-1);
      if(hh>midh) {
	midh = hh;
	midj = j;
      }
    }
    
    if(midj==0) {
      del(1);
      add(N);
    }
    else {
      if(midj>1)
	add(midj-1);
      displ[print_ptr++] = last_print = 0;
      if(midj<N)
	add(N-midj);
    }
    return midh;
  }
  
/* Divide: Find optimum midpoint (midi,midj) of cost midh */
  
  midi = M / 2;
  HH[0] = 0.0;
  t = -tb;
  for(j=1;j<=N;j++) {
    HH[j] = t = t-gh;
    DD[j] = t-g;
  }
  
  t = -tb;
  for(i=1;i<=midi;i++) {
    s=HH[0];
    HH[0] = hh = t = t-gh;
    f = t-g;
    for(j=1;j<=N;j++) {
      if ((hh=hh-g-gh) > (f=f-gh)) f=hh;
      if ((hh=HH[j]-g-gh) > (e=DD[j]-gh)) e=hh;
      hh = s + calc_score(i,j,A,B);
      if (f>hh) hh = f;
      if (e>hh) hh = e;
      
      s = HH[j];
      HH[j] = hh;
      DD[j] = e;
    }
  }
  
  DD[0]=HH[0];
  
  RR[N]=0;
  t = -te;
  for(j=N-1;j>=0;j--) {
    RR[j] = t = t-gh;
    SS[j] = t-g;
  }
  
  t = -te;
  for(i=M-1;i>=midi;i--) {
    s = RR[N];
    RR[N] = hh = t = t-gh;
    f = t-g;
    
    for(j=N-1;j>=0;j--) {
      
      if ((hh=hh-g-gh) > (f=f-gh)) f=hh;
      if ((hh=RR[j]-g-gh) > (e=SS[j]-gh)) e=hh;
      hh = s + calc_score(i+1,j+1,A,B);
      if (f>hh) hh = f;
      if (e>hh) hh = e;
      
      s = RR[j];
      RR[j] = hh;
      SS[j] = e;
      
    }
  }
  
  SS[N]=RR[N];
  
  midh=HH[0]+RR[0];
  midj=0;
  type=1;
  for(j=0;j<=N;j++) {
    hh = HH[j] + RR[j];
    if(hh>=midh)
      if(hh>midh || (HH[j]!=DD[j] && RR[j]==SS[j])) {
	midh=hh;
	midj=j;
      }
  }
  
  for(j=N;j>=0;j--) {
    hh = DD[j] + SS[j] + g;
    if(hh>midh) {
      midh=hh;
      midj=j;
      type=2;
    }
  }
  
  /* Conquer recursively around midpoint  */
  
  
  if(type==1) {             /* Type 1 gaps  */
    diff(A,B,midi,midj,tb,g);
    diff(A+midi,B+midj,M-midi,N-midj,g,te);
  }
  else {
    diff(A,B,midi-1,midj,tb,0.0);
    del(2);
    diff(A+midi+1,B+midj,M-midi-1,N-midj,0.0,te);
  }
  
  return midh;       /* Return the score of the best alignment */
}
Ejemplo n.º 2
0
/***********************************************************************
 * : 
 **********************************************************************/
int diff (int A, int B, int M, int N, int tb, int te, int *print_ptr, int *last_print, int *displ, int seq1, int seq2, int g, int gh)
{
   int i, j, f, e, s, t, hh;
   int midi, midj, midh, type;
   int HH[MAX_ALN_LENGTH];
        int DD[MAX_ALN_LENGTH];
   int RR[MAX_ALN_LENGTH];
   int SS[MAX_ALN_LENGTH];

   if (N <= 0) {if (M > 0) del(M, print_ptr, last_print, displ); return( - (int) tbgap(M)); }

   if (M <= 1) {

      if (M <= 0) {add(N, print_ptr, last_print, displ); return( - (int)tbgap(N));}

      midh = -(tb+gh) - tegap(N);
      hh   = -(te+gh) - tbgap(N);

      if (hh > midh) midh = hh;
      midj = 0;

      for (j = 1; j <= N; j++) {
         hh = calc_score(1,j,A,B,seq1,seq2) - tegap(N-j) - tbgap(j-1);
         if (hh > midh) {midh = hh; midj = j;}
      }

      if (midj == 0) {
         del(1, print_ptr, last_print, displ);
         add(N, print_ptr, last_print, displ);
      } else {
         if (midj > 1) add(midj-1, print_ptr, last_print, displ);
         displ[(*print_ptr)++] = *last_print = 0;
         if (midj < N) add(N-midj, print_ptr, last_print, displ);
      }

      return midh;
   }

   midi  = M / 2;
   HH[0] = 0.0;
   t     = -tb;

   for (j = 1; j <= N; j++) {
      HH[j] = t = t - gh;
      DD[j] = t - g;
   }

   t = -tb;

   for (i = 1; i <= midi; i++) {
      s     = HH[0];
      HH[0] = hh = t = t - gh;
      f     = t - g;
      for (j = 1; j <= N; j++) {
         if ((hh = hh - g - gh)    > (f = f - gh))    f = hh;
         if ((hh = HH[j] - g - gh) > (e = DD[j]- gh)) e = hh;
         hh = s + calc_score(i,j,A,B,seq1,seq2);
         if (f > hh) hh = f;
         if (e > hh) hh = e;

         s = HH[j];
         HH[j] = hh;
         DD[j] = e;
      }
   }

   DD[0] = HH[0];
   RR[N] = 0;
   t     = -te;

   for (j = N-1; j >= 0; j--) {RR[j] = t = t - gh; SS[j] = t - g;}

   t = -te;

   for (i = M - 1; i >= midi; i--) {
      s     = RR[N];
      RR[N] = hh = t = t-gh;
      f     = t - g;
      for (j = N - 1; j >= 0; j--) {
         if ((hh = hh - g - gh)    > (f = f - gh))     f = hh;
         if ((hh = RR[j] - g - gh) > (e = SS[j] - gh)) e = hh;
         hh = s + calc_score(i+1,j+1,A,B,seq1,seq2);
         if (f > hh) hh = f;
         if (e > hh) hh = e;

         s     = RR[j];
         RR[j] = hh;
         SS[j] = e;
      }
   }

   SS[N] = RR[N];

   midh = HH[0] + RR[0];
   midj = 0;
   type = 1;

   for (j = 0; j <= N; j++) {
      hh = HH[j] + RR[j];
      if (hh >= midh)
      if (hh > midh || (HH[j] != DD[j] && RR[j] == SS[j]))
         {midh = hh; midj = j;}
   }

   for (j = N; j >= 0; j--) {
      hh = DD[j] + SS[j] + g;
      if (hh > midh) {midh = hh;midj = j;type = 2;}
   }


   if (type == 1) {
      diff(A, B, midi, midj, tb, g, print_ptr, last_print, displ, seq1, seq2, g, gh);
      diff(A+midi, B+midj, M-midi, N-midj, g, te, print_ptr, last_print, displ, seq1, seq2, g, gh);
   } else {
      diff(A, B, midi-1, midj, tb, 0.0, print_ptr, last_print, displ, seq1, seq2, g, gh);
      del(2, print_ptr, last_print, displ);
      diff(A+midi+1, B+midj, M-midi-1, N-midj, 0.0, te, print_ptr, last_print, displ, seq1, seq2, g, gh);
   }

   return midh;
}