Notes for the swig_numpy/new directory
======================================

This set of files is for developing and testing file numpy.i, which
is intended to be a set of typemaps for helping SWIG interface between
C and C++ code that uses C arrays and the python module Numeric (also
known informally as NumPy, also to be replaced in the future with
scipy_core).  It is ultimately hoped that numpy.i will be included
as part of the SWIG and/or SciPy distribution(s).

In the spirit of "writing your tests first", I will begin by
describing the tests, as they are a good example of what we are trying
to do with numpy.i.  The files related to testing are

    series.h
    series.cxx
    testSeries.py

The series.h header file contains prototypes for functions that
illustrate the wrapping issues we wish to address.  Right now, this
consists of functions with argument signatures of the form

    (type* IN_ARRAY1, int DIM1)
    (type* IN_ARRAY2, int DIM1, int DIM2)
    (type* INPLACE_ARRAY1, int DIM1)

which take a pointer to an array of type "type", whose length is
specified by the integer(s) DIM1 (and DIM2).

The objective for the IN_ARRAY signatures is for SWIG to generate
python wrappers that take a container that constitutes a valid
argument to the Numeric.array constructor, and can be used to build an
array of type "type".  Currently, types "char", "unsigned char",
"signed char", "short", "int", "long", "float", "double" and
"PyObject" are supported, although only the types "short", "int",
"long", "float" and "double" are tested.

The objective for the INPLACE_ARRAY signatures is for SWIG to generate
python wrappers that accept a Numeric array of any of the above-listed
types.

The source file series.cxx contains the actual implementations of the
functions described in series.h.  The python script testSeries.py
tests the resulting python wrappers using the unittest module.

The SWIG interface file Series.i is used to generate the wrapper
code.  It is pretty short, but everything in it is important.  The
SWIG_FILE_WITH_INIT macro allows numpy.i to be used with multiple
python modules.  If it is specified, then the %init block found in
Series.i is required.  The other things done in Series.i are the
inclusion of the series.h and numpy.i files, and the "%apply"
directives to force the functions to use the typemaps.

The setup.py script is a standard python distutils script.  It defines
a _Series extension module and a Series python module.  The Makefile
automates everything, setting up the dependencies, calling swig to
generate the wrappers, and calling setup.py to compile the wrapper
code and generate the shared object.  Targets "all" (default) and
"clean" ar supported.

To build and test the code, simply execute from the shell,

    $ make
    $ testSeries.py

================================================================================

ToDo
====

  * Tests for the (INPLACE_ARRAY2, DIM1, DIM2) nedd to be added to
    series.h, series.cxx and testSeries.py.

  * Support for complex data types should be added.  Currently the
    macro substitution doesn't seem to like the two words you need to
    specify "complex double", etc.

  * ARGOUT typemaps need to be implemented and tested.  I stalled on
    this because SWIG implements a new method for aggregating output
    arguments; it has changed from a tuple to a list and requires
    importing a different SWIG library file.  I didn't particularly
    want to spend time trying to support both approaches, and I ended
    up not finishing a typemap for either.


Notes Bill:

The numpy.i file currently defines typemaps of the form

      (type* IN_ARRAY1, int DIM1)
      (type* IN_ARRAY2, int DIM1, int DIM2)
      (type* INPLACE_ARRAY1, int DIM1)
      (type* INPLACE_ARRAY2, int DIM1, int DIM2)

and has the beginnings of typemaps of the form

      (type* ARGOUT_ARRAY[ANY])
      (type* ARGOUT_ARRAY[ANY][ANY])

where "type" is almost any type supported by Numeric (I have had 
trouble with complex), the "1" suffix can be used with any dimension 
array as long as DIM1 reflects the total size, and the "2" suffix is 
for explicitly 2-dimensional arrays.  IN_ARRAYs can be any reasonable 
container that can be used to construct a Numeric array.  
INPLACE_ARRAYs must be Numeric arrays.

I hit a snag with the ARGOUT typemaps, because the swig libraries have 
changed and I did not know the best way to proceed.  Basically, the old 
way produced a tuple on the LHS if needed and the new way produces a 
list.  I forget why swig made the change, but the actual swig library 
file you import changed because of it and I didn't feel like spending 
time trying to support both approaches.

So the ARGOUT typemaps need to be finished, functions that would use 
them need to be added to series.{h,cxx} and tests for the resulting 
python interface need to be added to testSeries.py.

Most of the functions I deal with cannot use the ARGOUT typemaps 
anyway, because they usually involve input arrays that share the same 
dimension arguments as the output arrays, which will require a special 
approach.  So I don't have a lot of motivation there . . . but it 
definitely needs to be done before any kind of release.
