HappyDoc Generated Documentation ./src/editdist.c

. / src / editdist.c 

#include 
#include  

#include 

inline int min2(int a,int b) 
{
  return (acurr[j]+delcost && prev[j+1]+delcost>curr[j]+delcost) {
	  BT_POS(backTrace,i,j)=BT_MAXINS;
	  curr[j+1]=curr[j]+delcost;
	} else {
	  BT_POS(backTrace,i,j)=BT_MININS;
	  curr[j+1]=prev[j+1]+delcost;
	}
      } else {
	if (prev[j]+chgcostcurr[j]+delcost && prev[j+1]+delcost>curr[j]+delcost) {
	  BT_POS(backTrace,i,j)=BT_MAXINS;
	  curr[j+1]=curr[j]+delcost;
	} else {
	  BT_POS(backTrace,i,j)=BT_MININS;
	  curr[j+1]=prev[j+1]+delcost;
	}
      }
    }
    editDist=min2(editDist,curr[sminlen]);
    /* Done for one row. Now get a new curr. */
    tmp=curr;
    curr=prev;
    prev=tmp;
  }
		   

		   
  i=smaxlen-1;
  j=sminlen-1;
  minaln=(char*)malloc((sminlen+smaxlen+1)*sizeof(char));
  maxaln=(char*)malloc((sminlen+smaxlen+1)*sizeof(char));
  memset(minaln,0,sminlen+smaxlen+1);
  memset(maxaln,0,sminlen+smaxlen+1);
  aln_p=sminlen+smaxlen-1;

  while (i>=0 && j>=0) {
    switch(BT_POS(backTrace,i,j)) {
    case BT_MATCH:
      minaln[aln_p]=smin[j];
      maxaln[aln_p]=smax[i];
      i--;
      j--;
      break;
    case BT_MAXINS:
      minaln[aln_p]=smin[j];
      maxaln[aln_p]='-';
      j--;
      break;
    case BT_MININS:
      minaln[aln_p]='-';
      maxaln[aln_p]=smax[i];
      i--;
      break;

    }
    aln_p--;
  }

  while(i>=0) {
    minaln[aln_p]='-';
    maxaln[aln_p]=smax[i];
    i--;
    aln_p--;
  }
  while(j>=0) {
    minaln[aln_p]=smin[j];
    maxaln[aln_p]='-';
    j--;
    aln_p--;
  }


  if(countEnds) {
    editDist=prev[sminlen];
  }
  if(flipFlag) {
    stmp=minaln;
    minaln=maxaln;
    maxaln=stmp;
  }
  ret_val=Py_BuildValue("iss",editDist,minaln+aln_p+1,maxaln+aln_p+1);


  free(backTrace);
  free(prev);
  free(curr);
  free(minaln);
  free(maxaln);

  return ret_val;
}






static PyMethodDef EditDistMethods[] = {
    {"editDistance",  spam_editDistance, METH_VARARGS,
     "Computes the edit distance of two strings. If third argument is non zero, discard the ends of the longer sequence."},
    {"alignSeq",  spam_alignSeq, METH_VARARGS,
     "Computes the edit distance of two strings. If third argument is non zero, discard the ends of the longer sequence."},
    {NULL, NULL, 0, NULL}        /* Sentinel */
};



void
initeditdist(void)
{
    (void) Py_InitModule("editdist", EditDistMethods);
}



This document was automatically generated Wed Jan 14 12:00:46 2004 by HappyDoc version 3.0.a1