[SciPy-dev] [SciPy-user] linspace

David M. Cooke cookedm at physics.mcmaster.ca
Tue Dec 6 02:31:20 CST 2005


Travis Oliphant <oliphant.travis at ieee.org> writes:

> David M. Cooke wrote:
>
>>
>> Isn't compiling for me:
>>
>> [snip]
>> building 'scipy.base.multiarray' extension
>
>> scipy/base/src/arrayobject.c:3325: error: conflicting types for
>> ‘PyArray_NewFromDescr’
>> build/src/scipy/base/__multiarray_api.h:135: error: previous
>> declaration of ‘PyArray_NewFromDescr’ was here
>
> My bad, the new function had the wrong type-signature. There weren't a
> lot of 64-bit changes but I would like more 64-bit testing to find
> any more issues like this.

Ok, works now (almost). I get two failures for MA functions:

======================================================================
ERROR: Test of put
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/cookedm/usr/lib/python2.4/site-packages/scipy/base/tests/test_ma.py", line 277, in check_testPut
    x[[1,4]] = [10,40]
  File "/home/cookedm/usr/lib/python2.4/site-packages/scipy/base/ma.py", line 798, in __setitem__
    d[index] = value
IndexError: index (1) out of range (0<=index<=4) in dimension 0

======================================================================
ERROR: check_simple (scipy.base.shape_base.test_shape_base.test_apply_along_axis)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/cookedm/usr/lib/python2.4/site-packages/scipy/base/tests/test_shape_base.py", line 13, in check_simple
    assert_array_equal(apply_along_axis(len,0,a),len(a)*ones(shape(a)[1]))
  File "/home/cookedm/usr/lib/python2.4/site-packages/scipy/base/shape_base.py", line 36, in apply_along_axis
    outarr[ind] = res
IndexError: index (0) out of range (0<=index<=9) in dimension 0

----------------------------------------------------------------------
Ran 157 tests in 0.819s

>> (and more)
>>
>> I think the declarations in
>> scipy/base/code_generators/generate_array_api.py are out of sync with
>> current reality.
>
> Not the probelm but your solution would be nice anyway.

Here's what I'm planning: Functions that are part of the API will look
like this in the scipy/base/src/files:

/*OBJECT_API
 A documentation string.
*/
static PyObject *
PyArray_SomeAPIFunction(...and it's arguments)
{

generate_array_api.py will scan the source files, and generate the
appropiate objectapi_list and multiapi_list that are (right now)
assigned by hand in that file. To get the order, api functions will be
listed in files array_api_order.txt and multiarray_api_order.txt.
(The tag MULTIARRAY_API will be used for the multiarray API.)

So, to add a new function: change the source file (in
scipy/base/src/whatever), and add the function name to the appropiate
place in the appropiate *_api_order.txt inside scipy/base/code_generators.

Another thing I'm thinking about is using this to compute a hash of
the API, so extension modules can check that they're using the same
API as scipy. Putting this check into the import_array() macro would
mean that it'd be easier to track down those problems where the API's
changed, without the extension module being recompiled to match. It
could throw a warning much like Python when it tries to run something
compiled for an older C API.

[Depending how much mondo magic you'd want, it'd be possible to store
a string representation of the API, and pinpoint precisely _where_ the
API changed between the extension module and scipy_core -- but I'll
leave that for another day.]

-- 
|>|\/|<
/--------------------------------------------------------------------------\
|David M. Cooke                      http://arbutus.physics.mcmaster.ca/dmc/
|cookedm at physics.mcmaster.ca




More information about the Scipy-dev mailing list