[Python-Dev] a possible bug (or something I don't understand)?
Ognen Duzlevski
maketo at sdf.lonestar.org
Tue Jan 13 14:05:48 EST 2004
Hi,
Python 2.3.3 (#1, Dec 24 2003, 00:21:04)
[GCC 3.3] on linux2
Please forgive me if I am bold in the assumption of a bug. It probably is
not a bug but sure has me puzzled.
I have written a function using PyInline to modify three matrices (or,
lists of lists) of integers. The function appears to run fine.
After the function has been called, I am using the following assignment:
minscore =
min(scoremat[tlen][qlen],delmat[tlen][qlen],insertmat[teln][qlen])
However, the call breaks with:
TypeError: an integer is required
Then I went a step further and here is the sequence of calls:
def SeqMapping(tseq,qseq,seqmap,invmap,tlen,qlen):
# determine each energy components given the alignments
# modifies seqmap, invmap
# returns (minscore,identical)
global LARGESCORE,OPENGAPPENALTY,ONEINDELPENALTY,EMPTY
opengappenalty = OPENGAPPENALTY
oneindelpenalty = ONEINDELPENALTY
largescore = LARGESCORE
empty = EMPTY
minscore = largescore
scoremat = []
insertmat = []
delmat = []
st = time.clock()
DynAlign(scoremat,insertmat,delmat,''.join(tseq),''.join(qseq),tlen,qlen)
et = time.clock()
print "time in nested loop: %f" % (et-st)
m1 = int(delmat[tlen][qlen])
print m1
m2 = int(insertmat[tlen][qlen])
print m2
m3 = int(scoremat[tlen][qlen])
print m3
#minscore = min(int(delmat[tlen][qlen]), int(insertmat[tlen][qlen]), \
#int(scoremat[tlen][qlen]))
print min(m1,m2,m3)
This is the output:
time in nested loop: 0.250000
403
394
402
Traceback (most recent call last):
File "./primegens_old.py", line 1653, in ?
GetSegment()
File "./primegens_old.py", line 1496, in GetSegment
tmp_score,sim =
SeqMapping(seq[ndx1],seq[0],seqmapping,inversemapping,length[ndx1],length[0])
File "./primegens_old.py", line 676, in SeqMapping
print min(m1,m2,m3)
TypeError: an integer is required
Cleary scoremat[tlen][qlen], delmat[tlen][qlen] and insertmat[tlen][qlen]
are integers (I even had type() show me they are 'int'). I am even using
int() to make sure it is all right. Still the output is as above and I am
really puzzled. Is it something really trivial I am missing?
Thank you,
Ognen
p.s. just in case, here is the inlined C function:
from PyInline import C
import __main__
C.Builder(code="""
void DynAlign(PyObject *scoremat,PyObject *insertmat,PyObject
*delmat,PyObject *tseq,PyObject *qseq,PyObject *tlen,PyObject$
{
#define MIN(a,b) ((a) < (b) ? (a):(b))
int opengappenalty;
int oneindelpenalty;
int largescore;
int cnst;
int ndx1, ndx2;
int tl,ql;
char *tsq;
char *qsq;
opengappenalty = 4;
oneindelpenalty = 2;
largescore = 999999;
tl = PyInt_AsLong(tlen);
ql = PyInt_AsLong(qlen);
tsq = PyString_AsString(tseq);
qsq = PyString_AsString(qseq);
for (ndx1=0; ndx1<=tl; ndx1++)
{
PyList_Append(scoremat,PyList_New(ql+1));
PyList_Append(insertmat,PyList_New(ql+1));
PyList_Append(delmat,PyList_New(ql+1));
}
for (ndx1=1; ndx1<=tl; ndx1++)
{
long num;
PyObject* inner_list = NULL;
PyObject* item;
num = opengappenalty + (ndx1 * oneindelpenalty);
inner_list = PyList_GetItem(scoremat,ndx1);
item = PyInt_FromLong(num);
PyList_SetItem(inner_list,0,PyNumber_Int(item));
inner_list = PyList_GetItem(insertmat,ndx1);
PyList_SetItem(inner_list,0,PyNumber_Int(item));
inner_list = PyList_GetItem(delmat,ndx1);
item = PyInt_FromLong(largescore);
PyList_SetItem(inner_list,0,PyNumber_Int(item));
}
for (ndx1=1; ndx1<=ql; ndx1++)
{
long num;
PyObject* inner_list = NULL;
PyObject* item;
num = opengappenalty + (ndx1 * oneindelpenalty);
inner_list = PyList_GetItem(scoremat,0);
item = PyInt_FromLong(num);
PyList_SetItem(inner_list,ndx1,PyNumber_Int(item));
inner_list = PyList_GetItem(delmat,0);
PyList_SetItem(inner_list,ndx1,PyNumber_Int(item));
inner_list = PyList_GetItem(insertmat,0);
item = PyInt_FromLong(largescore);
PyList_SetItem(inner_list,ndx1,PyNumber_Int(item));
}
cnst = oneindelpenalty + opengappenalty;
for (ndx1=1; ndx1<=tl; ndx1++)
{
for (ndx2=1; ndx2<=ql; ndx2++)
{
PyObject *delm1 = NULL;
PyObject *delm2 = NULL;
PyObject *scmat1 = NULL;
PyObject *scmat2 = NULL;
PyObject *insmat1 = NULL;
PyObject *insmat2 = NULL;
PyObject *item = NULL;
long n1,n2,n3,minm,add;
delm1 = PyList_GetItem(delmat,ndx1);
delm2 = PyList_GetItem(delmat,ndx1-1);
scmat1 = PyList_GetItem(scoremat,ndx1);
scmat2 = PyList_GetItem(scoremat,ndx1-1);
insmat1 = PyList_GetItem(insertmat,ndx1);
insmat2 = PyList_GetItem(insertmat,ndx1-1);
item = PyList_GetItem(delm2,ndx2);
n1 = PyInt_AsLong(item) + oneindelpenalty;
item = PyList_GetItem(scmat2,ndx2);
n2 = PyInt_AsLong(item) + cnst;
item = PyList_GetItem(insmat2,ndx2);
n3 = PyInt_AsLong(item) + cnst;
minm = MIN(n1,MIN(n2,n3));
item = PyInt_FromLong(minm);
PyList_SetItem(delm1,ndx2,PyNumber_Int(item));
item = PyList_GetItem(insmat1,ndx2-1);
n1 = PyInt_AsLong(item) + oneindelpenalty;
item = PyList_GetItem(scmat1,ndx2-1);
n2 = PyInt_AsLong(item) + cnst;
item = PyList_GetItem(delm1,ndx2-1);
n3 = PyInt_AsLong(item) + cnst;
minm = MIN(n1,MIN(n2,n3));
item = PyInt_FromLong(minm);
PyList_SetItem(insmat1,ndx2,PyNumber_Int(item));
if (tsq[ndx1-1] == qsq[ndx2-1])
add = -1;
else
add = 1;
item = PyList_GetItem(scmat2,ndx2-1);
n1 = PyInt_AsLong(item);
item = PyList_GetItem(delm2,ndx2-1);
n2 = PyInt_AsLong(item);
item = PyList_GetItem(insmat2,ndx2-1);
n3 = PyInt_AsLong(item) + cnst;
minm = MIN(n1,MIN(n2,n3)) + add;
item = PyInt_FromLong(minm);
PyList_SetItem(scmat1,ndx2,PyNumber_Int(item));
}
}
}
""",targetmodule=__main__).build()
More information about the Python-Dev
mailing list