|
/ . / 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);
}
|