Main Todo Items
===============

We are looking for volunteers to do the following tasks.
Consult the TODO files in each directory first for specific
requirements.

* 1st-line support on the mailing lists (e.g. checking that bugs are
reproducible, and that all relevant information is supplied)

* Modified Ei(x) function (see specfunc/TODO)

* Eigensystems for non-symmetric matrices

* Quasi-random number distributions 

* ODE algorithms from RKSUITE

* Incomplete Fermi-Dirac functions

* General Legendre functions

* Spheroidal wave functions

* Weierstrass elliptic functions

* Complex Bessel Functions

* Additional volunteers with access to a good library to get copies of
papers for other developers.

* Estimates of condition numbers for linear solvers

* Sine and Cosine Transforms from FFTPACK  (Alok Singhal <as8ca@virginia.edu>)

* Cubature, e.g as provided by Cubpack. (Gert Van den Eynde
<gvdeynde@sckcen.be> ?)

* Mathieu functions (Lowell Johnson <ldj00@sio.midco.net>)

* Fresnel Integrals ("Juergen J. Zach" <jjzach@pacific.mps.ohio-state.edu>)

* Cumulative Distribution functions for discrete random distributions

Other tasks:

* Remove use of long double internally, e.g. as an accumulator in
loops. It introduces variation between platforms which is undesirable.
It should be replaced with a preprocessor variable ACC_DOUBLE so
that the user can compile the library with the old long double
behavior if desired.

* Use BLAS internally as much as possible, to take advantage of 
speed improvements on large-scale systems.  There may be some
instances where a simple for() loop is preferred since there's a
function-call overhead in calling BLAS routines.

* More tests. We should (at least) have a test for every error
condition.  Use GCOV to improve coverage.

* Annotate the header files with GAMS classifications.  See if they
can be included in the GAMs website.

* Make the return value EINVAL vs EDOM consistent for invalid
parameters. EDOM means a domain error (i.e. float or mathematically
undefined), EINVAL means invalid (i.e. zero length)

* Change return 0 to return GSL_SUCCESS, and return -1 to GSL_FAILURE
throughout, where appropriate. Similarly change any if(...) checks of
return values to use == GSL_SUCCESS, if they are checking for zero.
N.B. want to be careful about accidentally omitting error conditions
if using something like == GSL_FAILURE when function returns a
different error code.

* Make sure that all #defines are fully wrapped in ()'s, especially
the outermost layer which may have been missed. Everything should be
of the form #define foo(x) (....) so there is no possibility of bad
parsing.  Need a perl script to check this!

* Clean up the ordering of lines in the Makefile.am's so that they are
all consistent. At the moment the lines are in any order.

* Eliminate use of volatile where it has been used to force rounding
(integration/). It is better to write the code to avoid dependence on
rounding.

* Constant objects (like gsl_roots_fsolver_brent) ought to have
constant pointers (const gsl_roots_fsolver_type * const
gsl_roots_fsolver_brent)

* PyGSL -- python bindings for GSL, see http://pygsl.sf.net/

Wishlist or vague ideas
=======================

* An example chapter on how to link GSL code with GNU Guile, and Python

We could also provide g-wrap wrappers for guile, or swig.i files and
swig demos so that swig can be run more easily.

* Provide an interface to LAPACK, as for BLAS?  Clarify the license
for LAPACK first, their web page is vague on what the license terms
are.  Some parts of LAPACK are included in octave so maybe the Octave
maintainers will know more.

* Public domain or free texts which could be distributed with GSL:
     
Abramowitz and Stegun, "Handbook of Mathematical Functions" appears to
be public domain.

SEPT/02: See online images at http://members.fortunecity.com/aands/

Devroye's book on Random Variates (1st ed) is/was in the public
domain.  


* Investigate complex support in GCC: Operations like sin(z) silently
convert argument to double, losing the imaginary part. This is
mentioned in CEPHES documentation in 1998 with a patch to generate a
warning.  What happened? (Does it now work with gcc-3.0?)

* Go through the matrix and vector functions systematically and decide
what should be provided outside of BLAS.

* Standardize function names, in particular VERB vs NOUN (e.g. _invert
vs _inverse). Also adopt a convection for functions which can operate
in place vs use of workspace (e.g linalg_solve functions).

* Change from gsl-ref.texi to gsl.texi since it is the main file?
Also, put under dir section "Math" (which seems to be the appropriate
one for Debian, as Octave, Gnuplot etc are in that)

* Remove error stream stuff?? It is hardly used.

* Extend histogram routines as described in recent discussion

* Check that there are no conflicts when linking with Lapack. CBLAS, ATLAS

* Make a sorted datatype for the median and quantile functions so that
the user can be prevented from passing unsorted data, which is not
checked for.

* Optimization/error for dest == src as appropriate

* Provide a run-time expression evaluator for interactive programs
where the user can provide formulas as strings.  Keith Briggs
recommended formulc2.22 which he had found useful in several projects.
http://www.cs.brandeis.edu/~hhelf/formu/formulc.html. It is LGPL.
Alternatively, the source code for GDB contains yacc grammars and
evaluators for expressions in various languages, so that would be
another way to go.  It would have the advantage of following the
language standards.  If I was going to write something from scratch I
would think about using that as a base, as the full set of operators
are already included with the correct precedence rules. Being able to
evaluate C and Fortran expressions could be useful.

* We should have an index mapping type object which handles elements
of size_t for vectors and matrices, or at least vectors and matrices
of size_t in addition to long, int, etc.

* Fix up the workspace_alloc functions so they have consistent names
