[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