From 04f30601096050a15c7b2126cf88ecb05221befa Mon Sep 17 00:00:00 2001
From: Liam Healy <liam@thinkpad.local>
Date: Wed, 28 Jan 2009 21:31:15 -0500
Subject: [PATCH] Generic functions, fix interpolation

Turned many functions, particularly those having to do with
interpolation, into generic functions and methods, and thus renamed
them and changed their arglists.  Added test for basis spline; it
works in SBCL but does not in CCL.
---
 basis-splines.lisp                |  46 ++++++---
 chebyshev.lisp                    |  21 ++--
 documentation/status.text         |   4 +
 gsll-tests.asd                    |   3 +-
 gsll.asd                          |   4 +-
 init/init.lisp                    |   7 +-
 init/mobject.lisp                 |   7 +-
 interpolation/evaluation.lisp     |  95 +++++++++---------
 interpolation/spline-example.lisp |   4 +-
 interpolation/types.lisp          |  35 +++----
 tests/basis-spline.lisp           | 161 ++++++++++++++++++++++++++++++
 11 files changed, 289 insertions(+), 98 deletions(-)
 create mode 100644 tests/basis-spline.lisp

diff --git a/basis-splines.lisp b/basis-splines.lisp
index f93aaf35..e9215f22 100644
--- a/basis-splines.lisp
+++ b/basis-splines.lisp
@@ -1,6 +1,6 @@
 ;; Basis splines.
 ;; Liam Healy 2008-02-18 14:43:20EST basis-splines.lisp
-;; Time-stamp: <2009-01-25 10:11:48EST basis-splines.lisp>
+;; Time-stamp: <2009-01-28 20:55:57EST basis-splines.lisp>
 ;; $Id$
 
 (in-package :gsl)
@@ -12,6 +12,7 @@
 (defmobject basis-spline "gsl_bspline"
   ((order sizet) (number-of-breakpoints sizet))
   "basis spline"
+  :gsl-version (1 9)
   :documentation			; FDL
   "Allocate a workspace for computing B-splines. The number of
    breakpoints is given by number-of-breakpoints.  This leads to n =
@@ -22,6 +23,7 @@
 (defmfun knots (breakpoints workspace)
   "gsl_bspline_knots"
   (((mpointer breakpoints) :pointer) ((mpointer workspace) :pointer))
+  :gsl-version (1 9)
   :documentation			; FDL
   "Compute the knots associated with the given breakpoints and store
    them in the workspace.")
@@ -30,16 +32,22 @@
   "gsl_bspline_knots_uniform"
   ((a :double) (b :double) ((mpointer workspace) :pointer))
   :return (workspace)
+  :gsl-version (1 9)
   :documentation			; FDL
   "Compute knots uniformly on the interval [a, b] and store
    them in the workspace.")
 
 ;;; Evaluation of B-splines
 
-(defmfun evaluate-bspline (x B workspace)
+(defmfun evaluate
+    ((workspace basis-spline) x
+     &key (B (make-marray 'double-float
+			  :dimensions (number-of-coefficients workspace))))
   "gsl_bspline_eval"
   ((x :double) ((mpointer B) :pointer) ((mpointer workspace) :pointer))
+  :definition :method
   :outputs (B)
+  :gsl-version (1 9)
   :documentation			; FDL
   "Evaluate all B-spline basis functions at the position x and store
    them in the GSL vector B, so that the ith element of B is B_i(x).
@@ -53,27 +61,31 @@
 ;;; These are not documented but are in
 ;;; /usr/include/gsl/gsl_bspline.h; are they officially supported?
 
-(defmfun bspline-ncoeffs (B)
+(defmfun number-of-coefficients (bspline)
   "gsl_bspline_ncoeffs"
-  (((mpointer B) :pointer))
-  :c-return sizet)
+  (((mpointer bspline) :pointer))
+  :c-return sizet
+  :gsl-version (1 9))
 
-(defmfun bspline-order (B)
+(defmfun order (bspline)
   "gsl_bspline_order"
-  (((mpointer B) :pointer))
-  :c-return sizet)
+  (((mpointer bspline) :pointer))
+  :c-return sizet
+  :gsl-version (1 9))
 
-(defmfun number-of-breakpoints (B)
+(defmfun number-of-breakpoints (bspline)
   "gsl_bspline_nbreak"
-  (((mpointer B) :pointer))
+  (((mpointer bspline) :pointer))
   :c-return sizet
-  :documentation "The number of breakpoints of the basis spline B.")
+  :gsl-version (1 9)
+  :documentation "The number of breakpoints of the basis spline bspline.")
 
-(defmfun breakpoint (i B)
+(defmfun breakpoint (i bspline)
   "gsl_bspline_breakpoint"
-  ((i sizet) ((mpointer B) :pointer))
+  ((i sizet) ((mpointer bspline) :pointer))
   :c-return :double
-  :documentation "The ith breakpoint of the basis spline B.")
+  :gsl-version (1 9)
+  :documentation "The ith breakpoint of the basis spline bspline.")
 
 ;;; Examples and unit test
 
@@ -105,7 +117,7 @@
     ;; Fit matrix
     (dotimes (i ndata)
       ;; Compute B_j
-      (evaluate-bspline (maref x i) B bw)
+      (evaluate bw (maref x i) :b B)
       ;; Fill in row i of X
       (dotimes (j ncoeffs)
 	(setf (maref Xmatrix i j) (maref B j))))
@@ -115,9 +127,11 @@
     (loop for xi from 0.0d0 to 15.0d0 by 0.1d0
        with yval and yerr
        do
-       (evaluate-bspline xi B bw)
+       (evaluate bw xi :b B)
        (multiple-value-setq (yval yerr)
 	 (multi-linear-estimate B c cov))
        collect yval into yvals 
        collect yerr into yerrs
        finally (return (values yvals yerrs)))))
+
+(save-test basis-spline (bspline-example))
diff --git a/chebyshev.lisp b/chebyshev.lisp
index 67b551cc..bbf3c920 100644
--- a/chebyshev.lisp
+++ b/chebyshev.lisp
@@ -1,6 +1,6 @@
 ;; Chebyshev Approximations
 ;; Liam Healy Sat Nov 17 2007 - 20:36
-;; Time-stamp: <2009-01-25 10:12:45EST chebyshev.lisp>
+;; Time-stamp: <2009-01-28 19:05:30EST chebyshev.lisp>
 ;; $Id$
 
 (in-package :gsl)
@@ -26,12 +26,13 @@
 
 ;;; The functions that don't return are defined, but it is recommended
 ;;; to use the functions that do return error (and ignore it if
-;;; desired) in the form of #'evaluate-chebyshev.
+;;; desired) in the form of #'evaluate.
 
-(defmfun evaluate-chebyshev (chebyshev x &optional order)
+(defmfun evaluate ((object chebyshev) x &key order)
   ("gsl_cheb_eval" "gsl_cheb_eval_n")
-  ((((mpointer chebyshev) :pointer) (x :double))
-   (((mpointer chebyshev) :pointer) (order sizet) (x :double)))
+  ((((mpointer object) :pointer) (x :double))
+   (((mpointer object) :pointer) (order sizet) (x :double)))
+  :definition :method
   :c-return :double
   :documentation			; FDL
   "Evaluate the Chebyshev series at a point x.  If order is supplied,
@@ -89,8 +90,8 @@
 	  (format t "~&~a ~a ~a ~a"
 		  x
 		  (chebyshev-step x)
-		  (evaluate-chebyshev cheb x 10)
-		  (evaluate-chebyshev cheb x)))))))
+		  (evaluate cheb x :order 10)
+		  (evaluate cheb x)))))))
 
 (defun chebyshev-point-example (x)
   (check-type x double-float)
@@ -101,9 +102,9 @@
     (derivative-chebyshev deriv cheb)
     (integral-chebyshev integ cheb)
     (list
-     (evaluate-chebyshev cheb x)
-     (evaluate-chebyshev deriv x)
-     (evaluate-chebyshev integ x))))
+     (evaluate cheb x)
+     (evaluate deriv x)
+     (evaluate integ x))))
 
 ;;; Unit test
 (save-test chebyshev
diff --git a/documentation/status.text b/documentation/status.text
index 5f345c4d..09d580a4 100644
--- a/documentation/status.text
+++ b/documentation/status.text
@@ -35,6 +35,7 @@ series-acceleration
 linear-least-squares
 nonlinear-least-squares
 minimization-multi
+basis-spline
 
 === GSL questions ===
 Sun Nov  9 2008:
@@ -48,3 +49,6 @@ Sun Jan 11 2009:
 gsl_permutation_valid (presumably combination too) signals an error if
 the permutation is invalid, rather than just returning an error code.
 Is this intentional?
+Wed Jan 28 2009:
+What are the _e functions in interpolation for, how are the results to
+be interpreted?
diff --git a/gsll-tests.asd b/gsll-tests.asd
index 6036e186..6c810057 100644
--- a/gsll-tests.asd
+++ b/gsll-tests.asd
@@ -1,6 +1,6 @@
 ;; Definition of GSLL system 
 ;; Liam Healy
-;; Time-stamp: <2009-01-26 22:45:42EST gsll-tests.asd>
+;; Time-stamp: <2009-01-28 20:59:16EST gsll-tests.asd>
 ;; $Id$
 
 (asdf:defsystem "gsll-tests"
@@ -24,6 +24,7 @@
 	     (:file "airy")
 	     (:file "autocorrelation")
 	     (:file "axpy")
+	     (:file "basis-spline")
 	     (:file "bernoulli")
 	     (:file "bessel")
 	     (:file "beta")
diff --git a/gsll.asd b/gsll.asd
index 975c2a05..f40230c6 100644
--- a/gsll.asd
+++ b/gsll.asd
@@ -1,6 +1,6 @@
 ;; Definition of GSLL system 
 ;; Liam Healy
-;; Time-stamp: <2009-01-24 16:56:13EST gsll.asd>
+;; Time-stamp: <2009-01-28 21:05:10EST gsll.asd>
 ;; $Id$
 
 (asdf:defsystem "gsll"
@@ -196,4 +196,4 @@
 	       (:file "minimization-multi" :depends-on (generic))
 	       (:file "linear-least-squares")
 	       (:file "nonlinear-least-squares" :depends-on (generic))))
-     (:file "basis-splines" :depends-on (init data))))
+     (:file "basis-splines" :depends-on (init data random))))
diff --git a/init/init.lisp b/init/init.lisp
index 0c606ffa..01ad4671 100644
--- a/init/init.lisp
+++ b/init/init.lisp
@@ -1,6 +1,6 @@
 ;; Load GSL
 ;; Liam Healy Sat Mar  4 2006 - 18:53
-;; Time-stamp: <2009-01-26 21:39:39EST init.lisp>
+;; Time-stamp: <2009-01-27 21:32:59EST init.lisp>
 ;; $Id$
 
 (defpackage gsll
@@ -44,8 +44,9 @@
   (pushnew :callback-toplevel-only *features*))
 
 ;;; CFFI currently doesn't allow uninterned callback names for CCL;
-;;; patch here.
-
+;;; patch here.  This patch can be removed once the fix in CFFI:
+;;; http://common-lisp.net/pipermail/cffi-devel/2009-January/003046.html
+;;; makes it into a released version.
 #-openmcl (import 'cl-utilities:with-unique-names :gsll)
 
 #+openmcl
diff --git a/init/mobject.lisp b/init/mobject.lisp
index 9a63b10b..4e43f43f 100644
--- a/init/mobject.lisp
+++ b/init/mobject.lisp
@@ -1,7 +1,6 @@
 ;; Definition of GSL objects and ways to use them.
 ;; Liam Healy, Sun Dec  3 2006 - 10:21
-;; Time-stamp: <2009-01-25 17:27:46EST mobject.lisp>
-;; $Id$
+;; Time-stamp: <2009-01-28 19:19:54EST mobject.lisp>
 
 ;;; GSL objects are represented in GSLL as and instance of a 'mobject.
 ;;; The macro demobject takes care of defining the appropriate
@@ -149,6 +148,10 @@
 (defgeneric name (object)
   (:documentation "The name given to the GSL object."))
 
+(export 'evaluate)
+(defgeneric evaluate (object point &key)
+  (:documentation "Evaluate the GSL object."))
+
 ;;; Pointer type
 (eval-when (:compile-toplevel :load-toplevel :execute)
   (defconstant +foreign-pointer-class+ (class-name (class-of (cffi:null-pointer)))
diff --git a/interpolation/evaluation.lisp b/interpolation/evaluation.lisp
index 26539005..7f453a57 100644
--- a/interpolation/evaluation.lisp
+++ b/interpolation/evaluation.lisp
@@ -1,12 +1,14 @@
 ;; Evaluation of interpolation functions.
-;; Liam Healy, Sun Nov  4 2007 - 18:40
+;; Liam Healy Sun Nov  4 2007 - 18:40
+;; Time-stamp: <2009-01-28 19:22:15EST evaluation.lisp>
 
 (in-package :gsl)
 
-(defmfun evaluate-interpolation (interpolation xa ya x acceleration)
+(defmfun evaluate ((interpolation interpolation) x &key xa ya acceleration)
   "gsl_interp_eval"
   (((mpointer interpolation) :pointer) (xa :pointer) (ya :pointer) (x :double)
    ((mpointer acceleration) :pointer))
+  :definition :method
   :inputs (xa ya)
   :c-return :double
   :documentation			; FDL
@@ -14,73 +16,76 @@
    point x, using the interpolation object interpolation, data arrays
    xa and ya and the accelerator acceleration.")
 
-(defmfun derivative-evaluate-interpolation (interpolation xa ya x acceleration)
+(export 'evaluate-derivative)
+(defgeneric evaluate-derivative (object point &key)
+  (:documentation			; FDL
+   "Find the derivative of an interpolated function for a given point
+   x, using the interpolation object interpolation, data arrays
+   xa and ya and the accelerator acceleration."))
+
+(defmfun evaluate-derivative
+    ((interpolation interpolation) x &key xa ya acceleration)
   "gsl_interp_eval_deriv"
   (((mpointer interpolation) :pointer) (xa :pointer) (ya :pointer) (x :double)
    ((mpointer acceleration) :pointer))
+  :definition :method
   :inputs (xa ya)
-  :c-return :double
-  :documentation			; FDL
-  "Find the derivative of an interpolated function for a given point
+  :c-return :double)
+
+(export 'evaluate-second-derivative)
+(defgeneric evaluate-second-derivative (object point &key)
+  (:documentation			; FDL
+   "Find the second derivative of an interpolated function for a given point
    x, using the interpolation object interpolation, data arrays
-   xa and ya and the accelerator acceleration.")
+   xa and ya and the accelerator acceleration."))
 
-(defmfun second-derivative-evaluate-interpolation (interpolation xa ya x acceleration)
+(defmfun evaluate-second-derivative
+    ((interpolation interpolation) x &key xa ya acceleration)
   "gsl_interp_eval_deriv2"
   (((mpointer interpolation) :pointer) (xa :pointer) (ya :pointer) (x :double)
    ((mpointer acceleration) :pointer))
+  :definition :method
   :inputs (xa ya)
-  :c-return :double
-  :documentation			; FDL
-  "Find the second derivative of an interpolated function for a given point
-   x, using the interpolation object interpolation, data arrays
-   xa and ya and the accelerator acceleration.")
+  :c-return :double)
 
-(defmfun integral-evaluate-interpolation (interpolation xa ya x low high acceleration)
+(export 'evaluate-integral)
+(defgeneric evaluate-integral (object lower-limit upper-limit &key)
+  (:documentation			; FDL
+   "Find the numerical integral of an interpolated function over the
+   range [low, high], using the interpolation object interpolation,
+   data arrays xa and ya and the accelerator 'acceleration."))
+
+(defmfun evaluate-integral
+    ((interpolation interpolation) low high &key xa ya acceleration)
   "gsl_interp_eval_integ"
-  (((mpointer interpolation) :pointer) (xa :pointer) (ya :pointer) (x :double)
+  (((mpointer interpolation) :pointer) (xa :pointer) (ya :pointer)
    (low :double) (high :double) ((mpointer acceleration) :pointer))
+  :definition :method
   :inputs (xa ya)
-  :c-return :double
-  :documentation			; FDL
-  "Find the numerical integral of an interpolated function over the
-   range [low, high], using the interpolation object interpolation,
-   data arrays xa and ya and the accelerator 'acceleration.")
+  :c-return :double)
 
 ;;; Spline
-(defmfun evaluate-spline (spline x acceleration)
+(defmfun evaluate ((spline spline) x &key acceleration)
   "gsl_spline_eval"
   (((mpointer spline) :pointer) (x :double) ((mpointer acceleration) :pointer))
-  :c-return :double
-  :documentation
-  "Find the interpolated value of y for a given
-   point x, using the spline object spline, data arrays
-   xa and ya and the accelerator 'acceleration.")
+  :definition :method
+  :c-return :double)
 
-(defmfun derivative-evaluate-spline (spline x acceleration)
+(defmfun evaluate-derivative ((spline spline) x &key acceleration)
   "gsl_spline_eval_deriv"
   (((mpointer spline) :pointer) (x :double) ((mpointer acceleration) :pointer))
-  :c-return :double
-  :documentation			; FDL
-  "Find the derivative of an interpolated function for a given point
-   x, using the spline object spline, data arrays
-   xa and ya and the accelerator acceleration.")
+  :definition :method
+  :c-return :double)
 
-(defmfun second-derivative-evaluate-spline (spline x acceleration)
+(defmfun evaluate-second-derivative ((spline spline) x &key acceleration)
   "gsl_spline_eval_deriv2"
   (((mpointer spline) :pointer) (x :double) ((mpointer acceleration) :pointer))
-  :c-return :double
-  :documentation			; FDL
-  "Find the second derivative of an interpolated function for a given point
-   x, using the spline object spline, data arrays
-   xa and ya and the accelerator acceleration.")
+  :definition :method
+  :c-return :double)
 
-(defmfun integral-evaluate-spline (spline x low high acceleration)
+(defmfun evaluate-integral ((spline spline) low high &key acceleration)
   "gsl_spline_eval_integ"
-  (((mpointer spline) :pointer) (x :double) (low :double) (high :double)
+  (((mpointer spline) :pointer) (low :double) (high :double)
    ((mpointer acceleration) :pointer))
-  :c-return :double
-  :documentation			; FDL
-  "Find the numerical integral of an interpolated function over the
-   range [low, high], using the spline object spline,
-   data arrays xa and ya and the accelerator acceleration.")
+  :definition :method
+  :c-return :double)
diff --git a/interpolation/spline-example.lisp b/interpolation/spline-example.lisp
index 6cd0b2ac..c047e1f2 100644
--- a/interpolation/spline-example.lisp
+++ b/interpolation/spline-example.lisp
@@ -1,6 +1,6 @@
 ;; Example spline
 ;; Liam Healy, Sat Nov 10 2007 - 21:18
-;; Time-stamp: <2009-01-26 22:43:41EST spline-example.lisp>
+;; Time-stamp: <2009-01-28 19:05:32EST spline-example.lisp>
 ;; $Id$
 
 (in-package :gsl)
@@ -22,6 +22,6 @@
 	      collect (+ i (cos (expt i 2))))))
 	 (spline (make-spline *cubic-spline-interpolation* xarr yarr)))
     (loop for xi from (maref xarr 0) below (maref xarr 9) by step
-       collect (list xi (evaluate-spline spline xi acc)))))
+       collect (list xi (evaluate spline xi :acceleration acc)))))
 
 (save-test interpolation (spline-example 0.1d0))
diff --git a/interpolation/types.lisp b/interpolation/types.lisp
index a8859dd6..67448f23 100644
--- a/interpolation/types.lisp
+++ b/interpolation/types.lisp
@@ -1,6 +1,6 @@
 ;; Interpolation types
 ;; Liam Healy, Sun Nov  4 2007 - 17:41
-;; Time-stamp: <2008-12-26 17:23:12EST types.lisp>
+;; Time-stamp: <2009-01-28 21:02:31EST types.lisp>
 ;; $Id$
 
 (in-package :gsl)
@@ -53,28 +53,29 @@
   :documentation			; FDL
   "The name of the interpolation type.")
 
-(defmfun interpolation-minimum-size (interpolation)
-  "gsl_interp_min_size"
-  ((interpolation :pointer))
-  :c-return :uint
-  :documentation			; FDL
-  "The minimum number of points required by the
+(export 'minimum-size)
+(defgeneric minimum-size (object)
+  (:documentation			; FDL
+   "The minimum number of points required by the
    interpolation.  For example, Akima spline interpolation
-   requires a minimum of 5 points.")
+   requires a minimum of 5 points."))
+
+(defmfun minimum-size ((object interpolation))
+  "gsl_interp_min_size"
+  ((object :pointer))
+  :definition :method
+  :c-return :uint)
 
-(defmfun name ((interpolation spline))
+(defmfun name ((object spline))
   "gsl_spline_name"
-  ((interpolation :pointer))
+  ((object :pointer))
   :definition :method
   :c-return :string
   :documentation			; FDL
   "The name of the interpolation type.")
 
-(defmfun spline-minimum-size (interpolation)
+(defmfun minimum-size ((object spline))
   "gsl_spline_min_size"
-  ((interpolation :pointer))
-  :c-return :uint
-  :documentation			; FDL
-  "The minimum number of points required by the
-   interpolation.  For example, Akima spline interpolation
-   requires a minimum of 5 points.")
+  ((object :pointer))
+  :definition :method
+  :c-return :uint)
diff --git a/tests/basis-spline.lisp b/tests/basis-spline.lisp
new file mode 100644
index 00000000..65e3471d
--- /dev/null
+++ b/tests/basis-spline.lisp
@@ -0,0 +1,161 @@
+;; Regression test BASIS-SPLINE for GSLL, automatically generated
+
+(in-package :gsl)
+
+(LISP-UNIT:DEFINE-TEST BASIS-SPLINE
+                       (LISP-UNIT::ASSERT-NUMERICAL-EQUAL
+                        (LIST
+                         (LIST 1.113654203601724d0 1.0568431616397642d0
+                               0.9959492337772601d0 0.9313857548888193d0
+                               0.863566059849049d0 0.7929034835325566d0
+                               0.7198113608139506d0 0.6447030265678376d0
+                               0.567991815668826d0 0.4900910629915223d0
+                               0.4114141034105349d0 0.33237427180047124d0
+                               0.25338490303593875d0 0.17485933199154502d0
+                               0.09721089354189752d0 0.020852922561604002d0
+                               -0.05380124607472819d0 -0.1263382774924911d0
+                               -0.1963448368170776d0 -0.26340758917387974d0
+                               -0.32711319968829033d0 -0.3870483334857016d0
+                               -0.4427996556915059d0 -0.49395383143109584d0
+                               -0.5400975258298641d0 -0.5808174040132021d0
+                               -0.6157001311065035d0 -0.6443323722351599d0
+                               -0.6663007925245643d0 -0.681192057100109d0
+                               -0.6885928310871858d0 -0.6882406224802292d0
+                               -0.6804763107498367d0 -0.6657916182356474d0
+                               -0.6446782672773008d0 -0.6176279802144353d0
+                               -0.5851324793866916d0 -0.547683487133707d0
+                               -0.5057727257951217d0 -0.45989191771057447d0
+                               -0.4105327852197051d0 -0.3581870506621524d0
+                               -0.30334643637755515d0 -0.24650266470555254d0
+                               -0.18814745798578414d0 -0.12877253855788895d0
+                               -0.06886962876150586d0 -0.008930450936274169d0
+                               0.05055327257816704d0 0.10908981944217858d0
+                               0.16618746731612122d0 0.22135449386035613d0
+                               0.27409917673524387d0 0.32392979360114527d0
+                               0.37035462211842163d0 0.41288193994743294d0
+                               0.451020024748541d0 0.48427715418210626d0
+                               0.5121616059084895d0 0.5341816575880516d0
+                               0.5498455868811536d0 0.5588101965535437d0
+                               0.5613263897925215d0 0.5577935948907731d0
+                               0.548611240140985d0 0.5341787538358442d0
+                               0.5148955642680376d0 0.4911610997302516d0
+                               0.4633747885151729d0 0.4319360589154882d0
+                               0.39724433922388425d0 0.35969905773304744d0
+                               0.31969964273566454d0 0.2776455225244224d0
+                               0.23393612539200775d0 0.1889708796311067d0
+                               0.14314921353440657d0 0.09687055539459387d0
+                               0.050534333504354934d0 0.004539976156376795d0
+                               -0.04071308835665385d0 -0.08482543174205076d0
+                               -0.1273976257071268d0 -0.16803024195919558d0
+                               -0.20632385220557026d0 -0.24187902815356413d0
+                               -0.27429634151049076d0 -0.3031763639836635d0
+                               -0.3281196672803953d0 -0.34872682310799963d0
+                               -0.36459840317379d0 -0.3754490487696755d0
+                               -0.38144967952594844d0 -0.3828852846574976d0
+                               -0.38004085337921073d0 -0.37320137490597705d0
+                               -0.36265183845268406d0 -0.3486772332342208d0
+                               -0.3315625484654752d0 -0.31159277336133623d0
+                               -0.28905289713669163d0 -0.2642279090064302d0
+                               -0.23740279818544016d0 -0.2088625538886101d0
+                               -0.1788921653308282d0 -0.14777662172698278d0
+                               -0.11580091229196256d0 -0.0832500262406557d0
+                               -0.050408952787950545d0 -0.017562681148735534d0
+                               0.015003799462100892d0 0.04700549982967023d0
+                               0.07815743073908425d0 0.1081746029754547d0
+                               0.13677202732389296d0 0.16366471456951057d0
+                               0.18856767549741946d0 0.21119592089273095d0
+                               0.23126446154055688d0 0.24848830822600862d0
+                               0.262582471734198d0 0.27333670464506554d0
+                               0.2808397267178692d0 0.2852549995066957d0
+                               0.2867459845656324d0 0.2854761434487657d0
+                               0.28160893771018297d0 0.275307828903971d0
+                               0.2667362785842169d0 0.2560577483050075d0
+                               0.2434356996204298d0 0.22903359408457066d0
+                               0.21301489325151723d0 0.19554305867535646d0
+                               0.17678155191017514d0 0.15689383451006045d0
+                               0.13604336802909917d0 0.11439361402137835d0
+                               0.09210803404098494d0 0.06935008964200592d0
+                               0.04628324237852822d0 0.02307095380463884d0
+                               -1.23314525575291d-4 -0.023136101058027207d0
+                               -0.045803944238629914d0 -0.06796338251329648d0
+                               -0.08945095432793991d0 -0.11010319812847329d0
+                               -0.12975665236080958d0 -0.1482478554708619d0
+                               -0.16541334590454326d0)
+                         (LIST 0.04806705033080089d0 0.04089343066177248d0
+                               0.034838795412388296d0 0.029937767075799458d0
+                               0.026213618017648477d0 0.02364307349757936d0
+                               0.022116901458296107d0 0.021430143053988868d0
+                               0.021322348932951398d0 0.021540474336457206d0
+                               0.02188188435996076d0 0.0222054540673857d0
+                               0.022423602505266982d0 0.022489166302883192d0
+                               0.02238377836450195d0 0.022109367422047044d0
+                               0.02168242334336044d0 0.02113023443609739d0
+                               0.020488349912733197d0 0.019798630587670535d0
+                               0.019107308016746295d0 0.018462493935536436d0
+                               0.01791066877595287d0 0.017491988069952717d0
+                               0.017234883590369513d0 0.017151229365993295d0
+                               0.017233730244902976d0 0.017456620038303405d0
+                               0.017779406748415688d0 0.01815223131949235d0
+                               0.018521196010261802d0 0.018836982485690906d0
+                               0.019073196350902363d0 0.019217327089085613d0
+                               0.019264592249754273d0 0.019215982089075496d0
+                               0.019076879879751867d0 0.018856100653805198d0
+                               0.01856521914615675d0 0.018218084594983138d0
+                               0.017830438293313017d0 0.017419558956751364d0
+                               0.017003863777589945d0 0.01660239464194822d0
+                               0.01623412741882151d0 0.015917067816497d0
+                               0.015667148919313503d0 0.015497022432401463d0
+                               0.0154149182208477d0 0.015423795822817681d0
+                               0.01552098712890699d0 0.015698422254754915d0
+                               0.015943380857972117d0 0.01623958758583504d0
+                               0.016568424163857006d0 0.016910065000328406d0
+                               0.01724442257851929d0 0.017551871015661132d0
+                               0.017813775603460553d0 0.01801288827774422d0
+                               0.018133681647331996d0 0.01816539214712614d0
+                               0.018110548009755003d0 0.017976914236131087d0
+                               0.017774358040422943d0 0.017514489203896186d0
+                               0.017210386693353747d0 0.016876358562229223d0
+                               0.016527686124981858d0 0.016180304623312883d0
+                               0.01585037544111259d0 0.015553715088123652d0
+                               0.015305069750358231d0 0.015117264542195192d0
+                               0.015000309281752947d0 0.014960591645559853d0
+                               0.015000309281752937d0 0.015117264542195157d0
+                               0.01530506975035818d0 0.01555371508812358d0
+                               0.015850375441112518d0 0.016180304623312797d0
+                               0.016527686124981775d0 0.01687635856222915d0
+                               0.01721038669335367d0 0.017514489203896116d0
+                               0.017774358040422877d0 0.01797691423613104d0
+                               0.018110548009754975d0 0.018165392147126116d0
+                               0.018133681647331996d0 0.01801288827774424d0
+                               0.017813775603460587d0 0.017551871015661177d0
+                               0.017244422578519335d0 0.01691006500032847d0
+                               0.016568424163857065d0 0.016239587585835095d0
+                               0.01594338085797217d0 0.015698422254754957d0
+                               0.015520987128907015d0 0.0154237958228177d0
+                               0.015414918220847689d0 0.015497022432401438d0
+                               0.015667148919313464d0 0.015917067816496943d0
+                               0.016234127418821458d0 0.016602394641948143d0
+                               0.017003863777589865d0 0.017419558956751284d0
+                               0.017830438293312937d0 0.01821808459498308d0
+                               0.018565219146156692d0 0.018856100653805146d0
+                               0.01907687987975183d0 0.019215982089075486d0
+                               0.019264592249754298d0 0.01921732708908566d0
+                               0.01907319635090242d0 0.01883698248569099d0
+                               0.018521196010261903d0 0.018152231319492448d0
+                               0.01777940674841578d0 0.01745662003830348d0
+                               0.017233730244903024d0 0.017151229365993295d0
+                               0.017234883590369458d0 0.01749198806995261d0
+                               0.017910668775952716d0 0.018462493935536253d0
+                               0.019107308016746087d0 0.019798630587670316d0
+                               0.02048834991273299d0 0.02113023443609719d0
+                               0.02168242334336027d0 0.022109367422046923d0
+                               0.02238377836450188d0 0.022489166302883185d0
+                               0.022423602505267034d0 0.022205454067385794d0
+                               0.021881884359960874d0 0.021540474336457317d0
+                               0.021322348932951436d0 0.02143014305398876d0
+                               0.022116901458295757d0 0.023643073497578673d0
+                               0.02621361801764738d0 0.029937767075797934d0
+                               0.03483879541238634d0 0.0408934306617701d0
+                               0.04806705033079808d0))
+                        (MULTIPLE-VALUE-LIST (BSPLINE-EXAMPLE))))
+
-- 
GitLab