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