[SciPy-dev] Numeric CVS __array_struct__ interface is broken on 64 bit platforms

Andrew Straw strawman at astraw.com
Wed Nov 9 15:17:03 CST 2005


Thanks, Travis.  That works and now scipy.test(10,10) passes with 2 
failures in check_l_bfgs_b.

Thanks again, I'm very excited about the new scipy!

======================================================================
FAIL: limited-memory bound-constrained BFGS algorithm
----------------------------------------------------------------------
Traceback (most recent call last):
   File 
"/home/astraw/py24-amd64-dbg/lib/python2.4/site-packages/scipy/optimize/tests/test_optimize.py", 
line 120, in check_l_bfgs_b
     assert err < 1e-6
AssertionError

======================================================================
FAIL: limited-memory bound-constrained BFGS algorithm
----------------------------------------------------------------------
Traceback (most recent call last):
   File 
"/home/astraw/py24-amd64-dbg/lib/python2.4/site-packages/scipy/optimize/tests/test_optimize.py", 
line 120, in check_l_bfgs_b
     assert err < 1e-6
AssertionError

----------------------------------------------------------------------
Ran 1346 tests in 127.339s

FAILED (failures=2)
<unittest.TextTestRunner object at 0x2aaab28c4a78>
[2132778 refs]




Travis Oliphant wrote:
> Nils Wagner wrote:
> 
>> On Wed, 09 Nov 2005 12:35:34 -0700
>>  Travis Oliphant <oliphant at ee.byu.edu> wrote:
>>  
>>
>>> Andrew Straw wrote:
>>>
>>>   
>>>
>>>> Hi,
>>>>
>>>> A couple bugs have been reported (including mine last night) which
>>>> indicate a problem with the following bit of code in
>>>> Numerical/Src/arrayobject.c (near line 2200) on 64 bit platforms.  I
>>>> think it'll be a lot faster for someone else to fix it, so I'll 
>>>> leave it
>>>> at this for now.
>>>>
>>>>
>>>>     
>>>
>>> Try it out of CVS now.  I think I've fixed it.
>>>
>>>   
>>
>> cvs -d:pserver:anonymous at cvs.sourceforge.net:/cvsroot/numpy co -P 
>> Numerical
>> cvs [checkout aborted]: connect to 
>> cvs.sourceforge.net(66.35.250.207):2401 failed: Connection refused
>>  
>>
> I don't know, must be a sourceforge issue.  Note, however, that 
> anonymous check-out from source forge usually lags.  I'm attaching a 
> patch against Numeric 24.1 that fixes the problem (and a couple more as 
> well).
> 
> -Travis
> 
> 
> ------------------------------------------------------------------------
> 
> 15c15
> < /* $Id: arrayobject.c,v 1.103 2005/11/04 02:23:22 teoliphant Exp $ */
> ---
> 
>>/* $Id: arrayobject.c,v 1.107 2005/11/09 19:43:39 teoliphant Exp $ */
> 
> 2125a2126,2127
> 
>>    PyArrayInterface *inter=ptr;
>>    
> 
> 2126a2129,2131
> 
>>    if (inter->nd != 0 && (sizeof(int) != sizeof(Py_intptr_t))) {
>>	free(inter->shape);
>>    }
> 
> 2204a2210,2211
> 
>>	    inter->shape = (Py_intptr_t *)malloc(self->nd*2*sizeof(Py_intptr_t));
>>	    inter->strides = inter->shape + (self->nd);
> 
> 2207c2214
> < 		inter->strides[i] = self->dimensions[i];
> ---
> 
>>		inter->strides[i] = self->strides[i];
> 
> 2492a2500,2502
> 
>>static PyArray_Descr *_array_descr_fromstr(char *, int *);
>>
>>
> 
> 2498a2509
> 
>>    PyArray_Descr* descr;
> 
> 2507a2519,2548
> 
>>    
>>    if ((ip=PyObject_GetAttrString(op, "__array_typestr__"))!=NULL) {
>>	int swap=0;
>>	descr=NULL;
>>	if (PyString_Check(ip)) {
>>	    descr = _array_descr_fromstr(PyString_AS_STRING(ip), &swap);
>>	}   
>>	Py_DECREF(ip);
>>	if (descr) {
>>	    return max(minimum_type, descr->type_num);
>>	}
>>    }
>>    else PyErr_Clear();
>>    
>>    if ((ip=PyObject_GetAttrString(op, "__array_struct__")) != NULL) {
>>	PyArrayInterface *inter;
>>	char buf[40];
>>	int swap=0;
>>	descr=NULL;
>>	if (PyCObject_Check(ip)) {
>>	    inter=(PyArrayInterface *)PyCObject_AsVoidPtr(ip);
>>	    if (inter->version == 2) {
>>		snprintf(buf, 40, "|%c%d", inter->typekind, inter->itemsize);
>>		descr = _array_descr_fromstr(buf, &swap);
>>	    }
>>	}
>>	Py_DECREF(ip);
>>	if (descr) return max(minimum_type, descr->type_num);
>>    }
>>    else PyErr_Clear();
> 
> 2511,2521c2552,2557
> <         if(!ip) {
> <             /* the original code seems to make no provision for the __array__ */
> <             /* call to fail. I do this is a fallback, and the */
> <             /* actual call to __array__ does get checked elsewhere. */
> <             /* maybe ok?  Probably the Python error flag is on at this point*/
> <             /* -- Dubois 3/2002 */
> <             return (int)PyArray_OBJECT;
> <         }
> <         result = max(minimum_type, (int)((PyArrayObject *)ip)->descr->type_num);
> <         Py_DECREF(ip);
> <         return result;
> ---
> 
>>        if(ip && PyArray_Check(ip)) {
>>		result = max(minimum_type, (int)((PyArrayObject *)ip)->descr->type_num);
>>		Py_DECREF(ip);
>>		return result;
>>	}
>>	else Py_XDECREF(ip);
> 
> 2523a2560
> 
>>	
> 
> 3006a3044,3049
> 
>>	    if (!PyArray_Check(op)) {
>>		    Py_DECREF(op);
>>		    PyErr_SetString(PyExc_TypeError,
>>				    "No array interface and __array__"\
>>				    " method not returning Numeric array.");
>>		    return NULL;
> 
> 3007a3051
> 
>>	}
>>
>>
>>------------------------------------------------------------------------
>>
>>_______________________________________________
>>Scipy-dev mailing list
>>Scipy-dev at scipy.net
>>http://www.scipy.net/mailman/listinfo/scipy-dev




More information about the Scipy-dev mailing list